懒加载(延迟加载)

概念:为了推迟和数据库交互的时间,推迟到真正需要这个对象数据的时候。提高系统的性能

通过 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属性,尤其在多对多,一对多等关系映射中

       懒加载对系统的性能有很大的作用。

你可能感兴趣的:(懒加载(延迟加载))