標籤:c class a ext strong 檔案
懶載入要求Domain對象不能是final的,因為Hibernate需要產生一個繼承自該Domain對象的類來實現懶載入。懶載入主要有三種:
1. 對象的懶載入
2. 關聯集合的懶載入
3. 對象屬性的懶載入
對象的懶載入
對象的懶載入就是在對應檔的class標籤中設定lazy屬性為true,這時,如果用session.load方法擷取這個對象的話,Hibernate只返回一個代理對象,而不是真的去查詢資料庫,等到真正用到這個對象的時候,Hibernate才會去查詢資料庫。
關聯集合的懶載入
關聯集合的懶載入有多種:
1. 一對一映射懶載入
在一對一映射中,查詢主對象時,Hibernate是不進行懶載入的,即使在對應檔中設定了主對象的從對象的lazy屬性為proxy。在查詢從對象時,必須要滿足三個條件才能實現懶載入:
(1)從對象的對應檔中一對一映射的lazy屬性不能設定成false;
(2)從對象的對應檔中一對一映射的constrained屬性要設定成true;
(3)從對象的對應檔中一對一映射的fetch屬性要設定成select。
第一條是設定是否採用懶載入,設定成false當然就不能實現懶載入了,可以設定成proxy和no-proxy兩種;constrained屬性設定成 true是為了建立從對象表主鍵與主對象主鍵的外鍵關係的。如果這個屬性設定成false,那麼資料庫裡就不能保證主對象表裡一定有一條記錄與從對象表裡 的記錄相對應,Hibernate也就不知道從對象裡的主對象屬性是應該賦成null還是賦成一個代理對象,所以就只能把主對象的記錄也查詢一下才能確 認,這樣就無法應用懶加裁了,這也是查詢主對象時無法應用懶載入的原因;fetch屬性可以設定成select和join兩種,select是指查詢主對 象是通過另一條select語句去查詢。如果設定成join,也就是說在取從對象的時候會inner join一下主對象,如果是這樣的話,Hibernate就會直接把主對象資訊取出來,自然也不需要懶載入了。
2. 一對多映射懶載入
一對多映射時分兩種情況,一是查詢一對象時的懶載入;二是查詢多個物件時的懶載入。
先說查詢多個物件時的懶載入。不像一對一映射查詢主對象,預設時查詢一個多個物件時Hibernate也是會採用懶載入的。<many-to-one>標籤需要兩個屬性設定,一是lazy不能設定成false;二是fetch不能設定為join。道理與前面一樣。而這兩個屬性的預設值lazy是proxy、fetch是select,所以預設是進行懶載入的。
查詢一對象時,預設也是懶載入的。這回設定屬性應該是在集合標籤裡,而不是<one-to-many>標籤裡。並且lazy的值可以設定成true、false和extra三種,而不是之前的false、proxy和no-proxy三種。extra一種比較聰明的懶載入策略,如果調用集合的size/contains等方法的時候,hibernate並不會去載入整個集合的資料,而是發出一條適當的SQL語句,以便獲得需要的值,只有在真正需要用到這些集合元素對象資料的時候,才去發出查詢語句載入所有對象的資料。若要應用懶載入,應該設定lazy屬性為true或extra;並且fetch屬性要設定成select。
3. 多對多映射懶載入
多對多映射的懶載入與一對多映射懶載入在集合標籤上的設定是相似的,lazy屬性也有true、false和extra三個選項。
對象屬性的懶載入
Hibernate還支援對象屬性的懶載入。應用的情況比較少,而且應該在設計上避免出現這種情況