16.懶加載
性能:
發出的sql語句越少,性能越高
方法:
1、懶加載
2、抓取策略
3、緩存策略
4、HQL語句
懶加載
1、類的懶加載
1、利用session.load方法可以產生代理對象
2、在session.load方法執行的時候並不發出sql語句
3、在得到其一般屬性的時候發出sql語句
4、只針對一般屬性有效,針對標示符屬性是無效的
5、默認情況就是懶加載
2、集合的懶加載
<set name=”” lazy=”” cascasd=”” inverse=””>
lazy的值:
false 當session.get時,集合就被加載出來了
true 在遍歷集合的時候才加載
extra
針對集合做count,min,max,sum等操作
3、單端關聯的懶加載(多對一)
<many-to-one lazy="false/no-proxy/proxy"> no-porxy 默認值 true
根據多的一端加載一的一端,就一個數據,所以無所謂
總結:懶加載主要解決了一個問題:類、集合、many-to-one在時候發出SQL語句,加載數據
Hibernate懶加載/延遲加載機制總結
lazy:懶加載/延遲加載
Lazy的有效期:只有在session打開的時候纔有效;session關閉後lazy就沒效了。即持久化對象纔有效。
lazy策略可以用在:
* <class>標籤上:可以取值true/false
* <property>標籤上,可以取值true/false,這個特性需要類增強
* <set>/<list>等集合上,可以取值爲true/false/extra
* <one-to-one>/<many-to-one>等標籤上,可以取值false/proxy/no-proxy
6.1 get和load的區別:
* get不支持延遲加載,而load支持。
* 當查詢特定的數據庫中不存在的數據時,get會返回null,而load則拋出異常。
6.2 類(Class)的延遲加載:
* 設置<class>標籤中的lazy="true",或是保持默認(即不配置lazy屬性)
* 如果lazy的屬性值爲true,那麼在使用load方法加載數據時,只有確實用到數據的時候纔會發出sql語句;這樣有可能減少系統的開銷。
* //不會發出查詢sql
System.out.println("group id=" + group.getId());
這裏有一個問題,爲什麼加載主鍵的時候不需要發出sql語句。(因爲在將detached的對象轉變爲persistent對象的時候,調用Session對象的get/load方法的時候,已經傳入了id)
6.3 集合(collection)的延遲加載:可以取值true,false,extra
* 保持集合上的lazy的默認值,此時的效果和lazy="extra"是基本一樣的。
* 設置集合上的lazy=extra,此時的效果和lazy屬性的默認值是基本一樣的。但是推薦使用這個屬性值,因爲在統計時這種情況顯得比較智能。當然延遲是有效果的。
* 設置集合上的lazy=false
true:默認取值,它的意思是只有在調用這個集合獲取裏面的元素對象時,才發出查詢語句,加載其集合元素的數據
false:取消懶加載特性,即在加載對象的同時,就發出第二條查詢語句加載其關聯集合的數據
extra:一種比較聰明的懶加載策略,即調用集合的size/contains等方法的時候,hibernate
並不會去加載整個集合的數據,而是發出一條聰明的SQL語句,以便獲得需要的值,只有在真正需要用到這些集合元素對象數據的時候,纔去發出查詢語句加載所有對象的數據
6.4 Hibernate單端關聯懶加載策略:即在<one-to-one>/<many-to-one>標籤上可以配置
懶加載策略。可以取值爲:false/proxy/no-proxy
false:取消懶加載策略,即在加載對象的同時,發出查詢語句,加載其關聯對象
proxy:這是hibernate對單端關聯的默認懶加載策略,即只有在調用到其關聯對象的方法的時候才真正發出查詢語句查詢其對象數據,其關聯對象是代理類
no-proxy:這種懶加載特性需要對類進行增強,使用no-proxy,其關聯對象不是代理類
注意:在class標籤上配置的lazy屬性不會影響到關聯對象!!!