lazy,延遲加載 sql
Lazy的有效期:只有在session打開的時候纔有效;session關閉後lazy就沒效了。 數據庫
lazy策略能夠用在: session
* <class>標籤上:能夠取值true/falsespa
* <property>標籤上,能夠取值true/false,這個特性須要類加強hibernate
* <set>/<list>等集合上,能夠取值爲true/false/extra代理
* <one-to-one>/<many-to-one>等標籤上,能夠取值false/proxy/no-proxy對象
6.1 get和load的區別: get
* get不支持延遲加載,而load支持。io
* 當查詢特定的數據庫中不存在的數據時,get會返回null,而load則拋出異常。class
6.2 類(Class)的延遲加載:
* 設置<class>標籤中的lazy="true",或是保持默認(即不配置lazy屬性)
* 若是lazy的屬性值爲true,那麼在使用load方法加載數據時,只有確實用到數據的時候纔會發出sql語句;這樣有可能減小系統的開銷。
* //不會發出查詢sql
System.out.println("group id=" + group.getId());
這裏有一個問題,爲何加載主鍵的時候不須要發出sql語句。
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屬性不會影響到關聯對象!!!