Hibernate檢索策略之消極式載入和立即載入

來源:互聯網
上載者:User

標籤:

消極式載入:消極式載入(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檢索策略之消極式載入和立即載入

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.