Hibernate的載入方式

2021-08-16 19:18:03 字數 2087 閱讀 6102



1、即時載入:

即時載入是指,當實體載入完成後,立即載入該實體所關聯的資料。我們以前面討論一對多關聯對映的例子為例:客戶和客戶訂購的貨物是一對多的關係,所以我們在配置客戶實體類的集合時採用了下面的配置:

lazy=」false」>

我們注意,在set元素的lazy屬性被設定為false,此時就啟動了即時載入,看下面的**:

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())

當我們執行上面的**時,會生成如下類似的輸出:

select * from customer where name=』zx』;

select * from order where id=』1』;

query finish…...

我們看到當執行查詢customer實體操作時,會自動載入它所關聯的order實體物件,因此會出現第二條查詢語句,這就是即時載入的基本原理,當宿主實體載入時,會立即自動載入關聯的實體物件,並完成關聯實體物件的屬性填充和實體物件的構造。

2、延遲載入:

在即時載入中,當載入customer物件時,通過另一條查詢語句自動載入了它所關聯的實體物件,但是如果我們只需要customer物件資料,而不需要它所關聯的order物件的資料,此時就造成了效能的無謂損耗。延遲載入機制的引入,使這個問題得到了化解。還以上面的例子為例,當我們想起用延遲載入機制時,我們要進行如下的配置:

lazy=」true」>

在set元素的lazy屬性設定成true,此時就啟動了延遲載入,當我們再次執行上面的**時,會生成如下的輸出:

select * from customer where name=』zx』;

query finish…...

select * from order where id=』1』;

注意與即時載入不同,當我們執行查詢customer物件時,並沒有立即載入它所關聯的order物件,只有執行確實獲取關聯的order物件資料時,才會發起對關聯物件的查詢,這就是所謂的延遲載入機制,只有當確實需要獲取關聯資料時,才去真正載入關聯物件。有關延遲載入的高階應用請查閱《深入理解hibernate延時載入機制》。

3、預先載入:

要啟用預先載入,必須如下配置:

out-join=」auto」>

如我們所見,將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元素:

batch-size=」5」>

通過指定batch-size屬性的值,來指定批量載入尺寸以及啟用批量載入,以上配置每次最多同時載入5個同型別實體物件。一般來說,batch-size應該設定成乙個合理的小的整數值。(一般設定成<10)。

Hibernate資料載入方式

hibernate資料載入方式 1 即時載入 immediate loading 當實體載入完成後,立即載入與實體相關聯的資料。即當實體載入完成後,hibernate自動立即讀取與實體相關聯的資料,並且填充到實體對應的屬性中。這種載入通常有多條select語句,即select實體資料後,同時sele...

四種Hibernate資料載入方式

1 即時載入 immediate loading 當實體載入完成後,立即載入與實體相關聯的資料。即當實體載入完成後,hibernate自動立即讀取與實體相關聯的資料,並且填充到實體對應的屬性中。這種載入通常有多條select語句,即select實體資料後,同時select實體相關聯的資料。2 延遲載...

hibernate的懶載入

所以想讓乙個物件為非延時載入有兩種方法 第一種就是讓該物件訪問它的乙個屬性 第二種呼叫hinbernate.initialize 物件名 懶載入時候應注意的問題 1 懶載入的物件不能是final的,因為懶載入時hinbernate會自動生成乙個繼承自源物件的 物件,如果源物件是final的就不能被繼...