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(); }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: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
一次加载多个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(); }关联级别懒加载:
由两个属性控制,在关联属性<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/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