Hibernate的檢索策略包括類級別檢索策略和關聯級別檢索策略
類級別檢索策略有立即檢索和延遲檢索默認的檢索策略是立即檢索在Hibernate映射文件中通過在<class>上配置lazy屬性來確定檢索策略對於Session的檢索方式類級別檢索策略僅適用於load方法也就說對於getqurey檢索持久化對象都會被立即加載而不管lazy是false還是true一般來說我們檢索對象就是要訪問它因此立即檢索是通常的選擇由於load方法在檢索不到對象時會拋出異常(立即檢索的情況下)因此我個人並不建議使用load檢索而由於<class>中的lazy屬性還影響到多對一及一對一的檢索策略因此使用load方法就更沒必要了
關聯級別檢索策略有立即檢索延遲檢索和迫切左外連接檢索對於關聯級別檢索又可分為一對多和多對多多對一和一對一兩種情況討論
一對多和多對多關聯關系一般使用<set>配置<set>有lazy和outerjoin屬性它們的不同取值絕對了檢索策略
)立即檢索這是一對多默認的檢索策略此時lazy=falseouterjoin=false盡管這是默認的檢索策略但如果關聯的集合是無用的那麼就不要使用這種檢索方式
)延遲檢索此時lazy=trueouterjoin=false(outerjoin=true是無意義的)這是優先考慮的檢索方式
)迫切左外連接檢索此時 lazy=falseouterjoin=true這種檢索策略只適用於依靠id檢索方式(loadget)而不適用於query的集合檢索(它會采用立即檢索策略)相比於立即檢索這種檢索策略減少了一條sql語句但在Hibernate中只能有一個<set>配置成 outerjoin=true
多對一和一對一檢索策略一般使用<manytoone><onetoone>配置<manytoone>中需要配置的屬性是 outerjoin同時還需要配置one端關聯的<class>的lazy屬性(配置的可不是<manytoone>中的lazy哦)它們的組合後的檢索策略如下
) outerjoin=auto這是默認值如果lazy=true為延遲檢索如果lazy=false為迫切左外連接檢索
) outerjoin=true無關於lazy都為迫切左外連接檢索
) outerjoin=false如果lazy=true為延遲檢索否則為立即檢索
可以看到在默認的情況下(outerjoin=autolazy=false)對關聯的one端對象Hibernate采用的迫切左外連接檢索依我看很多情況下我們並不需要加載one端關聯的對象(很可能我們需要的僅僅是關聯對象的id)另外如果關聯對象也采用了迫切左外連接檢索就會出現select語句中有多個外連接表如果個數多的話會影響檢索性能這也是為什麼Hibernate通過hibernatemax_fetch_depth屬性來控制外連接的深度對於迫切左外連接檢索query的集合檢索並不適用它會采用立即檢索策略
對於檢索策略需要根據實際情況進行選擇對於立即檢索和延遲檢索它們的優點在於select語句簡單(每張表一條語句)查詢速度快缺點在於關聯表時需要多條select語句增加了訪問數據庫的頻率因此在選擇即檢索和延遲檢索時可以考慮使用批量檢索策略來減少select語句的數量(配置batchsize屬性)對於切左外連接檢索優點在於select較少但缺點是select語句的復雜度提高多表之間的關聯會是很耗時的操作另外配置文件是死的但程序是活的可以根據需要在程序裡顯示的指定檢索策略(可能經常需要在程序中顯示指定迫切左外連接檢索)為了清楚檢索策略的配置效果如何可以配置show_sql屬性查看程序運行時Hibernate執行的sql語句
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28686.html