** 延遲加載的好處**
1.降低了內(nèi)存的開銷沽损,在用到某些數(shù)據(jù)的時候才會到數(shù)據(jù)中進(jìn)行查詢。
2.提高了程序運行性能循头。
注:如果session被關(guān)閉了,而你又想用到某些數(shù)據(jù)炎疆,這個時候使用延遲加載會出錯卡骂;需要立即加載或者使用OpenSessionInView。
** 立即加載的壞處**
1.select語句的數(shù)目太多形入,需要頻繁的訪問數(shù)據(jù)庫全跨,會影響查詢性能。2.如在應(yīng)用程序只需要訪問DEPT對象亿遂,而不需要訪問EMP對象的場合浓若,加載EMP對象完全是多余的操作渺杉,這些EMP對象白白浪費了內(nèi)存空間。注:如果session被關(guān)閉了挪钓,而你想訪問EMP對象是越,這個時候是不會出錯的,因為對象都被加載到內(nèi)存了碌上。
** lazy屬性**
類級別
????1.true 延遲加載(默認(rèn)值)
????2.false 立即加載
一對多級聯(lián)級別
????1.true 延遲加載(默認(rèn)值)
????2.extra 增強延遲加載
????3.false 立即加載
多對一關(guān)聯(lián)級別
????1.proxy 延遲加載(默認(rèn)值)
????2.no-proxy 無代理延遲加載
????3.false 立即加載
類級別倚评,使用<class>元素來配置加載策略
立即加載
????將lazy屬性設(shè)置為false則為立即加載。
????當(dāng)時用load方法查詢數(shù)據(jù)的時候馏予,會立即執(zhí)行一條select語句天梧,來查詢出數(shù)據(jù)。
延遲加載
????如果程序加載一個持久化對象的目的是為了訪問它的屬性霞丧,則可以采用立即加載呢岗。如果程序加載一個持久化類對象的目的僅僅是為了獲取它的引用,而不訪問它的數(shù)據(jù)蛹尝,則可以使用延遲加載后豫。例如:
Dept dept = (Dept)session.load(Dept.class, 10);
Emp emp = new Emp(1,"TOM");
emp.setDept(dept);
session.save(emp);
????說明向數(shù)據(jù)保存了一個Emp對象,他與一個Dept對象進(jìn)行了關(guān)聯(lián)箩言。
如果Dept使用了延遲加載硬贯,則session不會執(zhí)行select語句來查詢對應(yīng)的數(shù)據(jù),這個時候Dept對象中的ID屬性為你設(shè)置的10陨收,其他屬性則為null饭豹,這是load方法的特點。
一對多和多對多關(guān)聯(lián)的查詢策略务漩,使用<set>元素來配置一對多或多對多加載策略<set>元素的lazy屬性拄衰,主要決定Dept對象的emps集合(emps屬性是Set集合)被初始化的時機,到底是加載Dept對象時就被初始化(從數(shù)據(jù)查詢數(shù)據(jù))饵骨,還是在程序訪問emps集合的時候在初始化翘悉。
立即加載
????通過Session的get方法加載ID為10的Dept對象。
????hibernate會執(zhí)行兩條select語句居触,第一條是select * from Dept where deptno = 妖混?第二條select * from Emp where DEPTNO = ?
????也就是說使用立即查詢轮洋,不管你有沒有用到emps集合中的數(shù)據(jù)制市,Hibernate都將給你查詢出來,放到內(nèi)存中弊予。
延遲加載
????延時加載只會先執(zhí)行一條select語句祥楣,select * from Dept where deptno = ?。
????當(dāng)你使用到了emps集合的時候误褪,才會執(zhí)行第二條select * from Emp where DEPTNO = 责鳍?語句來查詢出對應(yīng)的數(shù)據(jù)。
多對一關(guān)聯(lián)的查詢策略,在<many-to-no>元素用來設(shè)設(shè)置兽间。
立即加載
????立即加載和上面一樣历葛,會執(zhí)行兩條select語句來加載數(shù)據(jù)。
延遲加載
????當(dāng)使用get方法時渡八,立即執(zhí)行查詢Emp對象的select語句啃洋,Emp對象的dept屬性引用Dept代理類的實例,這個代理類實例的OID有EMP表的DEPTNO外鍵值決定屎鳍。
????當(dāng)使用dept屬性的時候才會執(zhí)行select語句來查詢Dept信息宏娄。