Hibernate檢索策略之延遲加載和立即加載



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


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM