懶載入(延遲載入)
概念:為了推遲和資料庫互動的時間,推遲到真正需要這個物件資料的時候。提高系統的效能
通過 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屬性,尤其在多對多,一對多等關係對映中
懶載入對系統的效能有很大的作用。