1、类级别的延迟加载
1、
是通过session.load方法实现的
在映射文件中:
<class name="cn.itcast.hibernate717.lazy.Customer" table="customer" catalog="test" lazy="true">
lazy表示延迟加载
2、 当映射文件中,class元素的属性lazy为false时,session.load将不采用延迟加载的策略
3、
Session session = HibernateSessionFactory.getSession();
Customer customer = (Customer)session.load(Customer.class, 2);//customer是一个代理对象
System.out.println(customer.getId());//加载ID的时候,是不发出sql语句的 标示符
System.out.println(customer.getName());//加载一般属性的时候,发出sql语句
session.close();
4、类级别的延迟加载只针对一般属性起作用
5、当获取一般属性的值时,才要发出sql语句去加载这个值
2、属性级别的延迟加载 (JPA)
3、集合的延迟加载
lazy
true 在加载集合中的数据的时候,发出sql语句 Iterator<Orders> iterator = ordersSet.iterator();
false 在加载类级别的对象时就会发出sql语句 Customer customer = (Customer)session.get(Customer.class, 2);
发出两条sql语句
1、查询customer表
2、查询order表
extra 更进一步的延迟加载策略
在执行ordersSet.size()时,只会提取出这个表中的行数,属性的值是不提取出来的
当类的延迟加载为true时,并且执行的是session.load方法时,这个时候,集合的延迟加载设置成lazy="false"是不起作用的
4、单端的延迟加载
在加载多的一方时怎么样去加载一的一方:
在many-to-one中,把lazy设置成false时,
在得到Order时,就把customer的数据也加载出来了
如果lazy设置成proxy时
在得到order对象时,是不会加载customer对象中的数据,只有当customer执行get方法时,才要发出sql语句去加载其属性
说明一点:
发出sql语句只能在session的环境下进行
总结:
1、类级别的延迟加载
在加载一个对象的时候,采取的加载策略
2、关联级别的延迟加载
在加载一个对象时,这个对象关联的对象的延迟加载策略
延迟加载是hibernate为了提升性能的一种方式