Hibernate中lazy屬性作用

2021-07-26 02:37:12 字數 1695 閱讀 4776

hibernate的檢索策略包括類級別檢索策略和關聯級別檢索策略。

類級別檢索策略有立即檢索和延遲檢索,預設的檢索策略是立即檢索。在hibernate對映檔案中,通過在上配置 lazy屬性來確定檢索策略。對於session的檢索方式,類級別檢索策略僅適用於load方法;也就說,對於get、qurey檢索,持久化物件都會被立即載入而不管lazy是false還是true.一般來說,我們檢索物件就是要訪問它,因此立即檢索是通常的選擇。由於load方法在檢索不到物件時會丟擲異常(立即檢索的情況下),因此我個人並不建議使用load檢索;而由於中的lazy屬性還影響到多對一及一對一的檢索策略,因此使用load方法就更沒必要了。

關聯級別檢索策略有立即檢索、延遲檢索和迫切左外連線檢索。對於關聯級別檢索,又可分為一對多和多對多、多對一和一對一兩種情況討論。

一對多和多對多關聯關係一般使用配置。有lazy和outer-join屬性,它們的不同取值絕對了檢索策略。

1)立即檢索:這是一對多預設的檢索策略,此時lazy=false,outer-join=false.儘管這是預設的檢索策略,但如果關聯的集合是無用的,那麼就不要使用這種檢索方式。

2)延遲檢索:此時lazy=true,outer-join=false(outer-join=true是無意義的),這是優先考慮的檢索方式。

3)迫切左外連線檢索:此時 lazy=false,outer-join=true,這種檢索策略只適用於依靠id檢索方式(load、get),而不適用於query的集合檢索(它會採用立即檢索策略)。相比於立即檢索,這種檢索策略減少了一條sql語句,但在hibernate中,只能有乙個配置成 outer-join=true.

多對一和一對一檢索策略一般使用、配置。中需要配置的屬性是 outer-join,同時還需要配置one端關聯的的lazy屬性(配置的可不是中的lazy哦),它們的組合後的檢索策略如下:

1) outer-join=auto:這是預設值,如果lazy=true為延遲檢索,如果lazy=false為迫切左外連線檢索。

2) outer-join=true,無關於lazy,都為迫切左外連線檢索。

3) outer-join=false,如果lazy=true為延遲檢索,否則為立即檢索。

可以看到,在預設的情況下(outer-join=auto,lazy=false),對關聯的one端物件hibernate採用的迫切左外連線檢索。依我看,很多情況下,我們並不需要載入one端關聯的物件(很可能我們需要的僅僅是關聯物件的id);另外,如果關聯物件也採用了迫切左外連線檢索,就會出現select語句中有多個外連線表,如果個數多的話會影響檢索效能,這也是為什麼hibernate通過 hibernate.max_fetch_depth屬性來控制外連線的深度。對於迫切左外連線檢索,query的集合檢索並不適用,它會採用立即檢索策略。

對於檢索策略,需要根據實際情況進行選擇。對於立即檢索和延遲檢索,它們的優點在於select語句簡單(每張表一條語句)、查詢速度快,缺點在於關聯表時需要多條select語句,增加了訪問資料庫的頻率。因此在選擇即檢索和延遲檢索時,可以考慮使用批量檢索策略來減少select語句的數量(配置batch-size屬性)。對於切左外連線檢索,優點在於select較少,但缺點是select語句的複雜度提高,多表之間的關聯會是很耗時的操作。另外,配置檔案是死的,但程式是活的,可以根據需要在程式裡顯示的指定檢索策略(可能經常需要在程式中顯示指定迫切左外連線檢索)。為了清楚檢索策略的配置效果如何,可以配置show_sql屬性檢視程式執行時hibernate執行的sql語句。

hibernate中lazy的使用

lazy 延遲載入 lazy 的有效期 只有在 session 開啟的時候才有效 session 關閉後lazy 就沒效了。lazy 策略可以用在 標籤上 可以取值true false 標籤上,可以取值true false,這個特性需要類增強 等集合上,可以取值為true false extra 等...

hibernate中lazy的使用

lazy,延遲載入 lazy的有效期 只有在session開啟的時候才有效 session關閉後lazy就沒效了。lazy策略可以用在 標籤上 可以取值true false 標籤上,可以取值true false,這個特性需要類增強 等集合上,可以取值為true false extra 等標籤上,可以...

Hibernate中fetch和lazy介紹

fetch 指定關聯物件抓取的方式,可以設定fetch select 和 fetch join select方式時先查詢返回要查詢的主體物件 列表 再根據關聯外來鍵id,每乙個物件發乙個select查詢,獲取關聯的物件,形成n 1次查詢 而join方式,主體物件和關聯物件用一句外來鍵關聯的sql同時...