hibernate中lazy的使用

hibernate中lazy的使用

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 getload的區別:

* 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語句。

6.3 集合(collection)的延遲加載:可以取值truefalseextra

* 保持集合上的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屬性不會影響到關聯對象!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章