1. 程式人生 > >hibernate&三種狀態的物件&一級快取&快照機制

hibernate&三種狀態的物件&一級快取&快照機制

持久化類概述

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

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]