延迟加载:延迟加载(lazy load懒加载)是当在真正需要数据时,才执行SQL语句进行查询。避免了无谓的性能开销。
延迟加载分类:
1.类级别的查询策略
2.一对多和多对多关联的查询策略
3.多对一关联的查询策略
什么情况下使用延迟加载?
如果程序加载一个对象的目的是为了访问它的属性,可以采用立即加载。如果程序加载一个持久化对象的目的是仅仅为了获得它的引用,可以采用延迟加载。
如何配置延时加载?
在Hibernate中通过对.hbm的lazy属性来赋值,不同位置出现lazy的作用和取值也是不同的。
步骤如下:
1.类级别的查询策略:
类级别可选的加载策略包括立即加载和延迟加载。默认为延迟加载。如果<class>元素的lazy属性为true。表示采用延迟加载;如果lazy属性为false,表示采用立即加载
以Emp和Dept为例:
在Dept.hbm.xml中的<Set>元素中添加属性 lazy="false" 表示立即加载
测试类:
@Test
public void oneTest(){
Dept dept=(Dept)session.load(Dept.class, 1);
//lazy true/false 类级别
System.out.println(dept.getDeptName());
load()方法在Id属性和getClass(),都已经储存到内存中,不用请求数据库,其他属性都需请求。
2.一对多和多对多关联的查询策略
如果对象中存在其他实体的集合则需要在hbm文件中配置set元素来进行表间的映射,而 在set元素中也可以添加lazy强延时加载。
set元素中lazy有三个值,false(非延时加载),true(延时加载),extra(加强延时加载)。
区别:这个策略能在进一步的帮我延迟加载这个对象,也就是代理对象的初始化时机。
测试类:
设定lazy属性为extra,实现效果:
解析:第一条sql到数据库进行检索部门信息,随即加载出Dept对象
第二条sql进行一个员工总记录获取,并没有加载Emp对象,他和lazy为true加载的时机不同。
3.多对一关联的查询策略
<many-to-one>元素用来设置多对一关联关系。lazy属性: 默认值为proxy,proxy:延迟加载,no-proxy:无代理延迟加载,false:立即加载。
测试类:
设定lazy为proxy,运行结果为:
总结:
Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。hibernate通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。Hibernate 的延迟加载(lazy load)本质上就是代理模式的应用。