1. 程式人生 > >懶載入(延遲載入)

懶載入(延遲載入)

概念:為了推遲和資料庫互動的時間,推遲到真正需要這個物件資料的時候。提高系統的效能

通過 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屬性,尤其在多對多,一對多等關係對映中

       懶載入對系統的效能有很大的作用。