概念:为了推迟和数据库交互的时间,推迟到真正需要这个对象数据的时候。提高系统的性能
通过 asm和cglib二个jar包实现懒加载。Domain是非final的
1、session.load懒加载
(1)返回的是一个代理对象,new关键字来创建一个代理对象,理解成一个快捷方式,不是真正的类,而是代理类。
(2)代理对象继承了原对象,所以用强制造型可以使用。
(3)代理对象限制:和代理关联的session关闭之前使用
(4)利用hibernate中的静态方法 hibernate.initialize(对象);它会让hibernate访问数据库getId() getClass() 方法不会访问数据库,他们的值在不妨问数据库下也能得到
(5)在映射文件class中的属性 lazy="false" 表示懒加载被关闭掉了,可以直接查询,跟get()一样
2、one-to-one(元素)懒加载:一对一的关联关系
(1)当我们查询的是主对象时,将两个表外连接查询出主对象和从对象,没有相应的懒加载
(2)当我们查询的是从对象时,从对象所关联的主对象,会赋代理对象,使用懒加载
(3)通过hibernate.initialize(从对象.get主对象())初始化,强迫hibernate访问数据库。
(4)满足三个条件才能实现懒加载:
1)lazy!=false
lazy有三个属性值: proxy使用代理 no-proxy不使用代理 false 不使用懒加载,立即查询。
2)constrained=true
从表中要有一个这样的属性,表示建立外键约束
3)fetch=select(从对象中one-to-one中设置)
lazy 指相关联的属性什么时候抓取
fetch 抓取的策略,以什么方式来抓取
select表示二次select语句查询
join 表示连接查询。如果加上,则懒加载不起作用,直接将两表连接查询。
3、one-to-many(元素)懒加载
1)lazy!=false
2)fetch=select
当fetch属性为join时候,懒加载失效,直接将两表连接并查询出结果。
4.many-to-one (元素):
1)lazy!=false
2)fetch=select
当fetch属性为join时候,懒加载失效,直接将两表连接并查询出结果。
5.many-to-many (元素):
1)lazy!=false
属性值为 true false 是否懒加载
2)fetch=select
当fetch属性为join时候,懒加载失效,直接将两表连接并查询出结果。
6.注意:
能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getId和getClass除外)hibernate会初始化这些代理,或用Hibernate.initialize(proxy)来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。
总结:在关联映射中使用懒加载来设置lazy和fetch属性,注意,要查询的哪一方的数据,就在相对应的映射文件中设置,一般在关联属性标签内加入属性
一般不用改变lazy属性和fetch属性,尤其在多对多,一对多等关系映射中
懒加载对系统的性能有很大的作用。