標籤:
消極式載入:消極式載入(lazy load懶載入)是當在真正需要資料時,才執行SQL語句進行查詢。避免了無謂的效能開銷。
消極式載入分類:
1.類層級的查詢策略
2.一對多和多對多關聯的查詢策略
3.多對一關聯的查詢策略
什麼情況下使用消極式載入?
如果程式載入一個對象的目的是為了訪問它的屬性,可以採用立即載入。如果程式載入一個持久化對象的目的是僅僅為了獲得它的引用,可以採用消極式載入。
如何配置延時載入?
在Hibernate中通過對.hbm的lazy屬性來賦值,不同位置出現lazy的作用和取值也是不同的。
步驟如下:
1.類層級的查詢策略:
類層級可選的載入策略包括立即載入和消極式載入。預設為消極式載入。如果<class>元素的lazy屬性為true。表示採用消極式載入;如果lazy屬性為false,表示採用立即載入
以Emp和Dept為例:
在Dept.hbm.xml中的<Set>元素中添加屬性 lazy="false" 表示立即載入
測試類別:
@Test public void oneTest(){ Dept dept=(Dept)session.load(Dept.class, 1); //lazy true/false 類層級 System.out.println(dept.getDeptName());
load()方法在Id屬性和getClass(),都已經儲存到記憶體中,不用請求資料庫,其他屬性都需請求。
2.一對多和多對多關聯的查詢策略
如果對象中存在其他實體的集合則需要在hbm檔案中配置set元素來進行表間的映射,而 在set元素中也可以添加lazy強延時載入。
set元素中lazy有三個值,false(非延時載入),true(延時載入),extra(加強延時載入)。
區別:這個策略能在進一步的幫我消極式載入這個對象,也就是代理對象的初始化時機。
測試類別:
設定lazy屬性為extra,實現效果:
解析:第一條sql到資料庫進行檢索部門資訊,隨即載入出Dept對象
第二條sql進行一個員工總記錄擷取,並沒有載入Emp對象,他和lazy為true載入的時機不同。
3.多對一關聯的查詢策略
<many-to-one>元素用來設定多對一關聯關係。lazy屬性: 預設值為proxy,proxy:消極式載入,no-proxy:無代理消極式載入,false:立即載入。
測試類別:
設定lazy為proxy,運行結果為:
總結:
Hibernae 的消極式載入是一個非常常用的技術,實體的集合屬性預設會被消極式載入,實體所關聯的實體預設也會被消極式載入。hibernate通過這種消極式載入來降低系統的記憶體開銷,從而保證 Hibernate 的運行效能。Hibernate 的消極式載入(lazy load)本質上就是代理模式的應用。
Hibernate檢索策略之消極式載入和立即載入