延遲加載:延遲加載(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)本質上就是代理模式的應用。