Hibernate的Session在加載一個Java對象時,可以將與這個對象相關聯的其他Java對象都加載到緩存中,以便程序及時調用。但有些情況下,我們不需要加載太多無用的對象到緩存中,一來這樣會撐爆內存,二來增加了訪問數據庫的次數。所以爲了合理的使用緩存,Hibernate提供了幾種檢索策略來供用戶選擇。
Hibernate的檢索策略
在Hibernate中主要有三種檢索策略,它們是立即檢索策略、延遲檢索策略、左外連接檢索策略。下面分別介紹一下這三種檢索策略。
立即檢索策略:
採用立即檢索策略,會將被檢索的對象,以及和這個對象關聯的一對多對象都加載到緩存中。Session的get方法就使用的立即檢索策略。
優點:頻繁使用的關聯對象能夠被加載到緩存中。
缺點:1、佔用內存。2、Select語句過多。
延遲檢索策略:
採用延遲檢索策略,就不會加載關聯對象的內容。直到第一次調用關聯對象時,纔去加載關聯對象。在不涉及關聯類操作時,延遲檢索策略只適用於Session的load方法。涉及關聯類操作時,延遲檢索策略也能夠適用於get,list等操作。
在類級別操作時, 延遲檢索策略,只加載類的OID不加載類的其他屬性,只用當第一次訪問其他屬性時,纔回訪問數據庫去加載內容。(這裏使用了CGLIB生成了類的代理類)
在關聯級別操作時,延遲檢索策略,只加載類本身,不加載關聯類,直到第一次調用關聯對象時,纔去加載關聯對象
程序模式都是用延遲加載策略。如果需要指定使用延遲加載策略。在配置文件中設置<class>的lazy=true,<set>的lazy=true或extra(增強延遲)<many-to-one>的lazy=proxy和no-proxy。
優點:由程序決定加載哪些類和內容,避免了大量無用的sql語句和內存消耗。
缺點:在Session關閉後,就不能訪問關聯類對象了。 需要確保在Session.close方法前,調用關聯對象。
左外連接檢索策略:
採用左外連接檢索,能夠使用Sql的外連接查詢,將需要加載的關聯對象加載在緩存中。
<set>fetch設置爲join,<many-to-one>的fetch設置爲 join
優點:1.對應用程序完全透明,不管對象處於持久化狀態,還是遊離狀態,應用程序都可以方便的從一個對象導航到與它關聯的對象。2.使用了外連接,select語句數目少。
無論是立即檢索還是延遲檢索,都可以指定關聯查詢的數量,這就需要使用batch-size屬性來指定,指定關聯查詢數量,以減少批量檢索的數據數目。
本文轉自:http://blog.csdn.net/adoocoke/article/details/8291966