-
1、延遲加載,也叫懶加載,它是Hibernate為
提高程序執行效率
而提供的一種機制,即只有真正使用該對象的數據時才會創建。 -
2、Hibernate中主要是通過
代理(proxy)機制
來實現延遲加載。它的具體過程:Hibernate從數據庫獲取某一個對象數據時,或獲取某一個對象的集合屬性值時,或獲取某一個對象所關聯的另一個對象時,由於沒有使用到該對象的數據,hibernate並不從數據庫加載真正的數據,而只是為該對象創建一個代理對象來代表這個對象,這個對象上的所有屬性都是默認值;只有在真正需要使用該對象的數據時才創建這個真實對象,真正從數據庫中加載它的數據,這樣在某些情況下,就可以提高查詢效率。
有如下程序代碼:
User user = (User) session.load(clazz, id); // 直接返回的是代理對象
System.out.println(user.getId()); // 沒有發送sql語句到數據庫加載
user.getName(); // 創建真實的User實例,並發送sql語句到數據庫中 -
注意:
- 1、不能判斷User = null;代理對象不可能為空
代理對象的限制:和代理關聯的session對象,如果session關閉后訪問代理則拋異常。session關閉之前訪問數據庫 - 2、getId()方法不行因為參數為ID,getClass()方法不用訪問數據庫就可以得到的數據
- 1、不能判斷User = null;代理對象不可能為空
-
Hibernate中默認采用延遲加載的情況主要有以下幾種
- 1、當調用session上的load()加載一個實體時,會采用延遲加載。
- 2、當session加載某個實體時,會對這個實體中的集合屬性值采用延遲加載。
- 3、當session加載某個實體時,會對這個實體所有單端關聯的另一個實體對象采用延遲加載。
- 當實體中存在另一個實體對象的時候,延遲加載決定了抓取方式:當為Lazy加載時,在一個session中,如果不訪問實體中的實體對象屬性,hibernate就不會級聯查詢內部實體,當為EAGER的時候,hibernate會在查詢實體的時候,級聯查詢實體內部的其他實體對象。
- 延遲加載也稱為懶加載,
是Hibernate3關聯關系對象默認的加載方式
,所謂延遲加載就是當在真正需要數據的時候,才真正執行數據加載操作。簡單理解為,只有在使用的時候,才會發出sql語句進行查詢。 - 延遲加載的有效期是在session打開的情況下,當session關閉后,會報異常。當調用load方法加載對象時,返回代理對象,等到真正用到對象的內容時才發出sql語句。
- 回顧事務:
- 事務:首先應該理解這個詞在SQL里面是什么意思。
- 事務:就是一組簡單的邏輯單元,事務的四個特性:原子性、一致性、隔離性、持久性。
- 事務的分類:顯示、隱式、自動提交。
- 事務的創建:開始事務:begin transcation
- 提交事務:commit transaction
- 回滾事務:rollback transaction
- 非延遲加載在讀取一個對象的時候會將與這個對象所有相關的其他對象一起讀取出來。
- Hibernate提供的延遲加載機制。這種初始化策略只在一個對象調用它的一對多或多對多關系時才將關系對象讀取出來。
- 這個過程對開發者來說
是透明的
,而且只進行了很少的數據庫操作請求
,因此會得到比較明顯的性能提升
。這項技術的一個缺陷是延遲加載技術要求一個Hibernate會話要在對象使用的時候一直開着
。
- 提高效率,主要是對屬性(在數據庫中存在相應的表)進行延遲加載(load),在第一次查詢的時候,只查詢當前的表,當用到延遲加載的對象時(非延遲加載會查詢所有關聯屬性的表),會先從緩存中去找延遲加載的對象(如果session已經關閉,會拋出SessionClosedException),如果對象已經在緩存中,則直接從緩存獲取,如果對象不在緩存中,則進入數據庫查找,所以,延遲加載是為了提高效率,如果在hibernate映射文件lazy設置成false,用load則和用get效果一樣。
- 延時加載是指:不是一開始就創建對象,而是當要調用的時候才去創建對象。
- 延時加載不是問題,是為了解決問題,在hibernate中,有兩種關系是相對存在的,就是一對多和多對一,如果同時使用這兩種關系,並且不使用延遲加載會很麻煩的。
- 比如:學生和班級的關系。
- 學生實體里應該存在一個班級實體,班級實體里應該存在學生集合。
- 如果使用急切加載,那么在查詢學生的時候需要查出班級,而班級又需要查詢學生集合,而每個學生又需要班級實體……如此反復,直到內存崩潰。
- 而是用延遲加載,在查詢學生時,不需要直接加載班級,在查詢班級時也不需要學生集合,他們都是在需要的時候才去查詢,很好得解決了死循環的問題。