Hibernate資料載入方式

來源:互聯網
上載者:User
 

資料載入方式: 在通過 JDBC 操作資料實,我們只能通過 SQL 語句來載入我們所需要的資料,但是到了 Hibernate 世界中(確切的說,是到了對象關係映射的世界中),由於有 O-R Mapping 的協助,我們擁有了更多的自由以及更多的方法, Hibernate 總共有 4 種資料載入方式,分別是:即時載入,消極式載入,積極式載入,批量載入,接下來我們分別討論這四種載入方式,以及它們的使用方法,然後在下一節我們重點討論消極式載入。 1、             即時載入:   即時載入是指,當實體載入完成後,立即載入該實體所關聯的資料。我們以前面討論一對多關聯映射的例子為例:客戶和客戶訂購的貨物是一對多的關係,所以我們在配置客戶實體類的集合時採用了下面的配置: <set name=”orders” table=”order” inverse=”true” cascade=”none” sort=”true” lazy=”false”>  <key column=”c_id”/> <one-to-many class=”com.neusoft.entity.Order”/> </set> 我們注意,在 set 元素的 lazy 屬性被設定為 true ,此時就啟動了即時載入 , 看下面的代碼: String hql=”from Customer c where c.name=’zx’ ”; List list=session.createQuery(hql).list(); System.out.println(“query finish….../n”); Iterator it=list.iterator(); While(it.hasNext()){  Customer customer=(Customer)it.next();  Set set=customer.getOrders(); } 當我們運行上面的代碼時,會產生如下類似的輸出: Select * from customer where name=’zx’; Select * from order where id=’1’; query finish…... 我們看到當執行查詢 Customer 實體操作時,會自動載入它所關聯的 Order 實體物件,因此會出現第二條查詢語句,這就是即時載入的基本原理,當宿主實體載入時,會立即自動載入關聯的實體物件,並完成關聯實體物件的屬性填充和實體物件的構造。 2、             消極式載入:   在即時載入中,當載入 Customer 對象時,通過另一條查詢語句自動載入了它所關聯的實體物件,但是如果我們只需要 Customer 對象資料,而不需要它所關聯的 Order 對象的資料,此時就造成了效能的無謂損耗。消極式載入機制的引入,使這個問題得到了化解。還以上面的例子為例,當我們想起用消極式載入機制時,我們要進行如下的配置: <set name=”orders” table=”order” inverse=”true” cascade=”none” sort=”true” lazy=”true”>  <key column=”c_id”/> <one-to-many class=”com.neusoft.entity.Order”/> </set> set 元素的 lazy 屬性設定成 true ,此時就啟動了消極式載入,當我們再次運行上面的代碼時,會產生如下的輸出: Select * from customer where name=’zx’; query finish…... Select * from order where id=’1’; 注意與即時載入不同,當我們執行查詢 Customer 對象時,並沒有立即載入它所關聯的 Order 對象,只有執行確實擷取關聯的 Order 對象資料時,才會發起對關聯對象的查詢,這就是所謂的消極式載入機制,只有當確實需要擷取關聯資料時,才去真正載入關聯對象。有關消極式載入的進階應用程式我們將在下一節中重點介紹。 3、             積極式載入:   要啟用積極式載入,必須如下配置: <set name=”orders” table=”order” inverse=”true” cascade=”none” sort=”true” out-join=”auto”>  <key column=”c_id”/> <one-to-many class=”com.neusoft.entity.Order”/> </set> 如我們所見,將 out-join 設定為 true ,這時就啟用了積極式載入,積極式載入與即時載入不同,它是通過外串連來載入關聯實體的,而不是通過兩條查詢語句來載入關聯實體,如上配置當我們再次執行上面的代碼時,會產生如下的輸出: Select * from customer c left outer join order o on c.id=o.id and c.name=’zx’; 4、             批量載入: 所謂批量載入,就是通過批量提交多個限定條件,一次完成多個資料的讀取。比如我們有如下的 SQL 語句: Select * from customer where id=’1’; Select * from customer where id=’2’; 我們可以將以上兩個 SQL 語句合并成如下形式: Select * from customer where id=’1’ or id=’2’; 這就是批量載入的原理,當使用批量載入時, Hibernate 會自動在當前 session 中尋找是否還有同類型的待載入的實體物件,如果有就將查詢條件合并到當前的查詢語句中,這樣就通過一次資料庫操作完成了多次讀取任務,從而提高了讀取效能。如果想啟用批量載入,必須如下配置實體類的 class 元素: <class name=”customer” table=”customer” batch-size=”5”> 通過指定 batch-size 屬性的值,來指定批量載入尺寸以及啟用批量載入,以上配置每次最多同時載入 5 個同類型實體物件。一般來說, batch-size 應該設定成一個合理的小的整數值。(一般設定成 <10  

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.