1. 程式人生 > >7.Hibernate 延遲載入&立即載入

7.Hibernate 延遲載入&立即載入

延遲載入的好處
1.降低了記憶體的開銷,在用到某些資料的時候才會到資料中進行查詢。
2.提高了程式執行效能。
注:如果session被關閉了,而你又想用到某些資料,這個時候使用延遲載入會出錯;需要立即載入或者使用OpenSessionInView。

立即載入的壞處
1.select語句的數目太多,需要頻繁的訪問資料庫,會影響查詢效能。
2.如在應用程式只需要訪問DEPT物件,而不需要訪問EMP物件的場合,載入EMP物件完全是多餘的操作,這些EMP物件白白浪費了記憶體空間。
注:如果session被關閉了,而你想訪問EMP物件,這個時候是不會出錯的,因為物件都被載入到記憶體了。

lazy屬性

類級別
1.true 延遲載入(預設值)
2.false 立即載入
一對多級聯級別 1.true  延遲載入(預設值)
2.extra  增強延遲載入
3.false  立即載入
多對一關聯級別 1.proxy  延遲載入(預設值)
2.no-proxy 無代理延遲載入
3.false  立即載入

類級別,使用<class>元素來配置載入策略
立即載入
  將lazy屬性設定為false則為立即載入。
  當時用load方法查詢資料的時候,會立即執行一條select語句,來查詢出資料。
延遲載入
  如果程式載入一個持久化物件的目的是為了訪問它的屬性,則可以採用立即載入。如果程式載入一個持久化類物件的目的僅僅是為了獲取它的引用,而不訪問它的資料,則可以使用延遲載入。例如:
Dept dept = (Dept)session.load(Dept.class, 10);
Emp emp = new Emp(1,"TOM");
emp.setDept(dept);
session.save(emp);
  說明向資料儲存了一個Emp物件,他與一個Dept物件進行了關聯。如果Dept使用了延遲載入,則session不會執行select語句來查詢對應的資料,這個時候Dept物件中的ID屬性為你設定的10,其他屬性則為null,這是load方法的特點。

一對多和多對多關聯的查詢策略,使用<set>元素來配置一對多或多對多載入策略
<set>元素的lazy屬性,主要決定Dept物件的emps集合(emps屬性是Set集合)被初始化的時機,到底是載入Dept物件時就被初始化(從資料查詢資料),還是在程式訪問emps集合的時候在初始化。
立即載入
  通過Session的get方法載入ID為10的Dept物件。
  Hibernate會執行兩條select語句,第一條是select * from Dept where deptno = ?第二條select * from Emp where DEPTNO = ?
  也就是說使用立即查詢,不管你有沒有用到emps集合中的資料,Hibernate都將給你查詢出來,放到記憶體中。
延遲載入
  延時載入只會先執行一條select語句,select * from Dept where deptno = ?。當你使用到了emps集合的時候,才會執行第二條select * from Emp where DEPTNO = ?語句來查詢出對應的資料。

多對一關聯的查詢策略,在<many-to-no>元素用來設設定。


立即載入
  立即載入和上面一樣,會執行兩條select語句來載入資料。
延遲載入
  當使用get方法時,立即執行查詢Emp物件的select語句,Emp物件的dept屬性引用Dept代理類的例項,這個代理類例項的OID有EMP表的DEPTNO外來鍵值決定。當使用dept屬性的時候才會執行select語句來查詢Dept資訊。