Hibernate -- lazy加载

                                                        Hibernate -- lazy加载

hibernate类级别懒加载:


    lazy:true(默认)

//类级别懒加载
    //load方法
    //class lazy属性
    //默认值:true load获得时,会返回代理对象,不查询数据库,使用时才查询
    public void fun1() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        Customer load = (Customer) session.load(Customer.class, 17);
        System.out.println("----------------sql语句未发送");
        System.out.println(load.getName());
        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }

lazy :false

//类级别懒加载
    //load方法
    //class lazy属性
    //默认值:false load方法执行就会发送sql语句,和get方法一致
    public void fun2() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        Customer load = (Customer) session.load(Customer.class, 19);
        System.out.println("----------------sql语句发送");
        System.out.println(load.getName());
        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }




hibernate (一对多)加载策略

关联级别懒加载的配置以及查询方式:


lazy:false

  //关联级别懒加载
    //lazy:false
    public void fun2() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        Customer load = (Customer) session.get(Customer.class, 19);

        System.out.println("所有的--------sql语句发送");
        for (Order o : load.getOrders()) {
            System.out.println(o.getName());
        }
        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }

fetch:

    fetch:join  / lazy:false  立刻使用select语句加载集合数据 
    fetch:join  / lazy:true  立刻使用select语句加载集合数据 
    fetch:join  / lazy:extra  立刻使用select语句加载集合数据 

两种相同:会立刻加载出集合数据   

fetch:join  / lazy:ture  查询集合时使用表连接查询,会立刻加载出集合数据 //关联级别懒加载
    //lazy:false
    //fetch :join
    public void fun3() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        Customer load = (Customer) session.get(Customer.class, 19);

        System.out.println("左外连接查询--------sql语句发送");
        for (Order o : load.getOrders()) {
            System.out.println(o.getName());
        }
        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    select:(默认)表连接语句查询集合数据  lazy:false 

fetch:subselect  / lazy:false  立刻使用select语句加载集合数据 

一次加载多个customer的订单数据

    //关联级别懒加载
    //lazy:false
    //fetch :subselect
    public void fun4() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        List<Customer> list = session.createQuery("from com.huhu.domain.Customer").list();
        for (Customer c : list) {
            System.out.println(c.getName() + c.getOrders().size());
        }
        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }

fetch:subselect  / lazy:true  立刻使用select语句加载集合数据 
    //关联级别懒加载
    //lazy:true
    //fetch :subselect
    public void fun5() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        List<Customer> list = session.createQuery("from com.huhu.domain.Customer").list();
        System.out.println("使用order时才去数据库查询");
        for (Customer c : list) {
            System.out.println(c.getName() + c.getOrders().size());
        }
        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }

fetch:select  / lazy:true (默认)普通的查询语句
//关联级别懒加载
    //lazy:true
    //fetch :select
    public void fun6() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        System.out.println("customer--------sql语句发送");
        Customer load = (Customer) session.get(Customer.class, 17);

        System.out.println("order--------sql语句发送");
        for (Order o : load.getOrders()) {
            System.out.println(o.getName());
        }
        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }

fetch:select  / lazy:false  立刻使用select语句加载集合数据
 //关联级别懒加载
    //lazy:false
    //fetch :select
    public void fun7() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        Customer load = (Customer) session.get(Customer.class, 17);

        System.out.println("所有的--------sql语句发送");
        for (Order o : load.getOrders()) {
            System.out.println(o.getName());
        }
        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }




关联级别懒加载:

  由两个属性控制,在关联属性<set>中的两个属性:lazy和fecth,他们的对应值分别为 true,false,extra/select,subselect,join,这样一共有9中方法。仔细看看关于extra。

        true/select:(默认值)会在使用集合是加载,普通的select语句

        true/subselect:会在使用集合时加载,子查询语句,是延迟加载

        true/join和false/join和extra/join:查询时使用表链接查询,会立刻加载集合数据,都没有延时加载

        false/select:立刻使用select语句加载集合数据

        false/subselect:会在查询customer时,  立即使用子查询加载客户的订单数据          

       extra:特别懒惰,如果时用集合时,之调用size()方法查询数量时,Hibernate发送count语句,只查询数量,不查询集合内数据
        extra/select
 //关联级别懒加载
    //lazy:extra
    //fetch :select
    public void fun8() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        Customer load = (Customer) session.get(Customer.class, 17);

        System.out.println("-------查询数量count()------");
        System.out.println(load.getOrders().size());
        System.out.println("----------查询customer--------");
        for (Order o : load.getOrders()) {
            System.out.println(o.getName());
        }
        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }

        extra/subselect

//关联级别懒加载
    //lazy:extra
    //fetch :subselect
    public void fun9() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        List<Customer> list = session.createQuery("from com.huhu.domain.Customer").list();
        for (Customer c : list) {
            System.out.println(c.getName() + "------------" + c.getOrders().size());
        }
        for (Customer cs : list) {
            for (Order o : cs.getOrders()) {
                System.out.println(cs.getName() + "------------" + o.getName());
            }
        }
        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }


        

  



hibernate:加载策略多对一

多对一:
lazy
  false 加载订单时,会立即加载客户
  proxy 看客户对象的类加载策略来决定
  no-proxy : 不做研究. 
  fetch=
select  : (默认值)使用普通select加载

join : 使用表链接加载数据


测试:

package com.huhu.b_lazy;

import com.huhu.domain.Customer;
import com.huhu.domain.Order;
import com.huhu.utils.HibernateUtils;
import org.hibernate.Session;

import java.util.List;

/**
 * 加载策略:多对一
 */
public class HibernateDemo3 {


    //fetch:select
    //lazy:false
    //默认:与我关联的数据时,在使用时才会加载。
    public void fun1() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        Order order = (Order) session.get(Order.class, 17);
        System.out.println(order.getCustomer().getName());
        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    //fetch:select
    //lazy:proxy
    //Customer类加载策略:lazy :false
    //默认:与我关联的数据时,在使用时才会加载。
    public void fun2() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        Order order = (Order) session.get(Order.class, 17);

        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    //fetch:select
    //lazy:proxy
    //Customer类加载策略:lazy :true
    //默认:与我关联的数据时,在使用时才会加载。
    public void fun3() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        Order order = (Order) session.get(Order.class, 19);
        System.out.println(order.getCustomer().getName());
        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    //fetch:join
    //lazy:proxy|false
    //Customer类加载策略:lazy :true
    //默认:与我关联的数据时,在使用时才会加载。
    public void fun4() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();
        //--------------------------------------
        Order order = (Order) session.get(Order.class, 19);
        //--------------------------------------
        session.getTransaction().commit();
        session.close();
    }

    public static void main(String[] args) {
        HibernateDemo3 d = new HibernateDemo3();
        d.fun4();
    }
}

如果想看代码得话可以复制以上代码测试。



原文地址:https://www.cnblogs.com/meiLinYa/p/9222670.html