hibernate&三種狀態的物件&一級快取&快照機制
阿新 • • 發佈:2019-01-03
持久化類概述
1. Hibernate的持久化類持久化類:Java類與資料庫的某個表建立了對映關係.這個類就稱為是持久化類.
持久化類 = Java類 + hbm的配置檔案
持久化物件的三種狀態
Hibernate的持久化類的狀態Hibernate為了管理持久化類:將持久化類分成了三個狀態
瞬時態:Transient Object
沒有持久化標識OID, 沒有被納入到Session物件的管理.
持久態:Persistent Object
有持久化標識OID,已經被納入到Session物件的管理.
脫管態:Detached Object
有持久化標識OID,沒有被納入到Session物件的管理.
![## 持久化類概述 ## 1. Hibernate的持久化類 持久化類:Java類與資料庫的某個表建立了對映關係.這個類就稱為是持久化類. 持久化類 = Java類 + hbm的配置檔案 ## 持久化物件的三種狀態 ## Hibernate的持久化類的狀態 Hibernate為了管理持久化類:將持久化類分成了三個狀態 瞬時態:`Transient Object` 沒有持久化標識OID, 沒有被納入到Session物件的管理. 持久態:`Persistent Object` 有持久化標識OID,已經被納入到Session物件的管理. 脫管態:`Detached Object` 有持久化標識OID,沒有被納入到Session物件的管理. ![持久化物件的三種狀態 ][1] ## Hibernate持久化物件的狀態的轉換 ## - `瞬時態-- 沒有持久化標識OID, 沒有被納入到Session物件的管理` 獲得瞬時態的物件 User user = new User() 瞬時態物件轉換持久態 save()/saveOrUpdate(); 瞬時態物件轉換成脫管態 user.setId(1) - `持久態-- 有持久化標識OID,已經被納入到Session物件的管理` 獲得持久態的物件 get()/load(); 持久態轉換成瞬時態物件 delete(); --- 比較有爭議的,進入特殊的狀態(刪除態:Hibernate中不建議使用的) 持久態物件轉成脫管態物件 session的close()/evict()/clear(); - `脫管態-- 有持久化標識OID,沒有被納入到Session物件的管理` 獲得託管態物件:不建議直接獲得脫管態的物件. User user = new User(); user.setId(1); 脫管態物件轉換成持久態物件 update();/saveOrUpdate()/lock(); 脫管態物件轉換成瞬時態物件 user.setId(null); - `注意:持久態物件有自動更新資料庫的能力!!!` ![Hibernate持久化物件的狀態的轉換][2] 程式碼演示: 持久態物件有自動更新資料庫的能力 ![持久態物件有自動更新資料庫的能力][3] ## Session物件的一級快取 ## 1. 什麼是快取? 其實就是一塊記憶體空間,將資料來源(資料庫或者檔案)中的資料存放到快取中.再次獲取的時候 ,直接從快取中獲取.可以提升程式的效能! 2. Hibernate框架提供了兩種快取 一級快取 -- 自帶的不可解除安裝的.一級快取的生命週期與session一致.一級快取稱為session級別的快取. 二級快取 -- 預設沒有開啟,需要手動配置才可以使用的.二級快取可以在多個session中共享資料,二級快取稱為是sessionFactory級別的快取. 3. Session物件的快取概述 Session介面中,有一系列的java的集合,這些java集合構成了Session級別的快取(一級快取).將物件存入到一級快取中,session沒有結束生命週期,那麼物件在session中存放著 記憶體中包含Session例項 --> Session的快取(一些集合) --> 集合中包含的是快取物件! 4. 證明一級快取的存在,編寫查詢的程式碼即可證明 在同一個Session物件中兩次查詢,可以證明使用了快取 5. Hibernate框架是如何做到資料發生變化時進行同步操作的呢? 使用get方法查詢User物件 然後設定User物件的一個屬性,注意:沒有做update操作。發現,資料庫中的記錄也改變了。 利用快照機制來完成的(SnapShot) 測試一級快取: ![一級快取][4] ## 控制Session的一級快取 ## 學習Session介面中與一級快取相關的方法 Session.clear() -- 清空快取。 Session.evict(Object entity) -- 從一級快取中清除指定的實體物件。 Session.flush() -- 刷出快取(原本是提交事務才快取比較快照,flush重新整理會提前比較) ## 快照機制 ## ![快照機制][5] [1]: http://www.suyibk.top/usr/uploads/2018/04/1565016060.jpg [2]: http://www.suyibk.top/usr/uploads/2018/04/2012776169.png [3]: http://www.suyibk.top/usr/uploads/2018/04/1672921047.png [4]: http://www.suyibk.top/usr/uploads/2018/04/1672921047.png [5]: http://www.suyibk.top/usr/uploads/2018/04/181361271.png](http://www.suyibk.top/usr/uploads/2018/04/1565016060.jpg)
Hibernate持久化物件的狀態的轉換
- 瞬時態-- 沒有持久化標識OID, 沒有被納入到Session物件的管理獲得瞬時態的物件
User user = new User()
瞬時態物件轉換持久態
save()/saveOrUpdate();
瞬時態物件轉換成脫管態
user.setId(1)
- 持久態-- 有持久化標識OID,已經被納入到Session物件的管理
獲得持久態的物件
get()/load();
持久態轉換成瞬時態物件
delete(); --- 比較有爭議的,進入特殊的狀態(刪除態:Hibernate中不建議使用的)
持久態物件轉成脫管態物件
session的close()/evict()/clear();
- 脫管態-- 有持久化標識OID,沒有被納入到Session物件的管理
獲得託管態物件:不建議直接獲得脫管態的物件.
User user = new User();
user.setId(1);
脫管態物件轉換成持久態物件
update();/saveOrUpdate()/lock();
脫管態物件轉換成瞬時態物件
user.setId(null);
- 注意:持久態物件有自動更新資料庫的能力!!!
![![Hibernate持久化物件的狀態的轉換][2]](http://www.suyibk.top/usr/uploads/2018/04/2012776169.png)
程式碼演示: 持久態物件有自動更新資料庫的能力
![![持久態物件有自動更新資料庫的能力][3]](http://www.suyibk.top/usr/uploads/2018/04/1672921047.png)
Session物件的一級快取
1. 什麼是快取?其實就是一塊記憶體空間,將資料來源(資料庫或者檔案)中的資料存放到快取中.再次獲取的時候 ,直接從快取中獲取.可以提升程式的效能!
2. Hibernate框架提供了兩種快取
一級快取-- 自帶的不可解除安裝的.一級快取的生命週期與session一致.一級快取稱為session級別的快取.
二級快取-- 預設沒有開啟,需要手動配置才可以使用的.二級快取可以在多個session中共享資料,二級快取稱為是sessionFactory級別的快取.
3. Session物件的快取概述
Session介面中,有一系列的java的集合,這些java集合構成了Session級別的快取(一級快取).將物件存入到一級快取中,session沒有結束生命週期,那麼物件在session中存放著
記憶體中包含Session例項 --> Session的快取(一些集合) --> 集合中包含的是快取物件!
4. 證明一級快取的存在,編寫查詢的程式碼即可證明
在同一個Session物件中兩次查詢,可以證明使用了快取
5. Hibernate框架是如何做到資料發生變化時進行同步操作的呢?
使用get方法查詢User物件
然後設定User物件的一個屬性,注意:沒有做update操作。發現,資料庫中的記錄也改變了。
利用快照機制來完成的(SnapShot)
測試一級快取:
![![一級快取][4]](http://www.suyibk.top/usr/uploads/2018/04/1672921047.png)
控制Session的一級快取
學習Session介面中與一級快取相關的方法Session.clear()-- 清空快取。
Session.evict(Object entity)-- 從一級快取中清除指定的實體物件。
Session.flush()-- 刷出快取(原本是提交事務才快取比較快照,flush重新整理會提前比較)
快照機制
![![快照機制][5]](http://www.suyibk.top/usr/uploads/2018/04/181361271.png)