hibernate中lazy的使用 lazy,延遲加載 Lazy的有效期:只有在session打開的時候纔有效;session關閉後lazy就沒效了。 lazy策略能夠用在: *
標籤上:能夠取值true/false *
標籤上,能夠取值true/false,這個特性須要類加強 *
/
等集合上,能夠取值爲true/false/extra *
/
等標籤上,能夠取值false/proxy/no-proxy 6.1 get和load的區別: * get不支持延遲加載,而load支持。 * 當查詢特定的數據庫中不存在的數據時,get會返回null,而load則拋出異常。 6.2 類(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單端關聯懶加載策略:即在
/
標籤上能夠配置 懶加載策略。能夠取值爲:false/proxy/no-proxy false:取消懶加載策略,即在加載對象的同時,發出查詢語句,加載其關聯對象 proxy:這是hibernate對單端關聯的默認懶加載策略,即只有在調用到其關聯對象的方法的時候才真正發出查詢語句查詢其對象數據,其關聯對象是代理類 no-proxy:這種懶加載特性須要對類進行加強,使用no-proxy,其關聯對象不是代理類 注意:在class標籤上配置的lazy屬性不會影響到關聯對象!!! 注:在修改lazy= "false"時,不要只是修改映射關係第一行,還要修改相關的set集合等 hibernate3.0中lazy有三個值,true,false,proxy,默認的是lazy="proxy". 具體設置成什麼要看你的需求,並非說哪一個設置就是最好的。 假如在student對象中包含一個head對象 若是你肯定在用student對象的時候就要用到head對象裏的屬性,那你就設置當即加載,由於設置當即加載那麼在查詢student的同時就會查詢student的head,hibernate就會在查詢的時候關聯兩張表從而生成的sql就可能只有一條。而若是你設置的是延遲加載,那麼確定會要生成1+N條sql語句:其中「1」是查詢student的語句,「N」是根據N個student的id去查詢head的N條語句。並且,延遲加載是要用到的時候纔去執行查詢,這樣系統判斷那裏須要加載,那裏不須要加載也須要時間,性能上確定就不如當即加載了! 若是,你是有的地方須要用到student的時候纔用到head屬性,那麼你就設置成延遲加載,由於查詢2張表的數據確定要比查詢1張表的數據消耗大。 到低要怎樣設置就要看你的實際需求了