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的檢索策略小結
hibernate的檢索策略包括類級別檢索策略和關聯級別檢索策略。類級別檢索策略有立即檢索和延遲檢索,預設的檢索策略是立即檢索。在hibernate對映檔案中,通過在上配置lazy屬性來確定檢索策略。對於session的檢索方式,類級別檢索策略僅適用於load方法 也就說,對於get qurey檢索...
Hibernate 檢索策略
在預設情況下,當hibernate從資料庫中載入物件時,會同時載入所有關聯的物件.但實際應用中可能不需要使用其關聯的物件,這樣就可能通過設定hibernate的檢索策略,來優化檢索效能.hiberante提供了3種檢索策略 1 立即檢索 2 延遲檢索 3 迫切左外連線檢索 下面先從概念上去理解,先在...
Hibernate檢索策略
預設的檢索策略是立即檢索。在hibernate對映檔案中,通過在上配置 lazy屬性來確定檢索策略。對於session的檢索方式,類級別檢索策略僅適用於load方法 也就說,對於get qurey檢索,持久化物件都會被立即載入而不管lazy是false還是true.一般來說,我們檢索物件就是要訪問它...