詳細講解在Hibernate中檢索策略的應用
Hibernate的檢索
關聯級別檢索策略有立即檢索、延遲檢索和迫切左外連接檢索。對于關聯級別檢索,又可分為一對多和多對多、多對一和一對一兩種情況討論。
一對多和多對多關聯關系一般使用< set>配置。< set>有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.
多對一和一對一檢索策略一般使用< many-to-one>、< one-to-one>配置。< many-to-one>中需要配置的屬性是 outer-join,同時還需要配置one端關聯的< class>的lazy屬性(配置的可不是< many-to-one>中的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語句,增加了訪問數據庫的頻率。因此在選擇即檢索和延遲檢索時,可以考慮使用批量檢索策略來