hibernate&三種狀態的物件&一級快取&快照機制
阿新 • • 發佈:2019-01-03
持久化類概述
1. Hibernate的持久化類持久化類:Java類與資料庫的某個表建立了對映關係.這個類就稱為是持久化類.
持久化類 = Java類 + hbm的配置檔案
持久化物件的三種狀態
Hibernate的持久化類的狀態Hibernate為了管理持久化類:將持久化類分成了三個狀態
瞬時態:Transient Object
沒有持久化標識OID, 沒有被納入到Session物件的管理.
持久態:Persistent Object
有持久化標識OID,已經被納入到Session物件的管理.
脫管態:Detached Object
有持久化標識OID,沒有被納入到Session物件的管理.
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);
- 注意:持久態物件有自動更新資料庫的能力!!!
程式碼演示: 持久態物件有自動更新資料庫的能力
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)
測試一級快取:
控制Session的一級快取
學習Session介面中與一級快取相關的方法Session.clear()-- 清空快取。
Session.evict(Object entity)-- 從一級快取中清除指定的實體物件。
Session.flush()-- 刷出快取(原本是提交事務才快取比較快照,flush重新整理會提前比較)