Hibernate持久化物件的狀態
1. 站在持久化的角度 , Hibernate 把物件分為 4 種狀態 : 持久化狀態, 臨時狀態, 遊離狀態(脫管狀態) , 刪除狀態.Session 的特定方法能使物件從一個狀態轉換到另一個狀態 .
2. 臨時狀態(Transient) :
1). 在使用代理主鍵的情況下 , OID 通常為 null
2). 不處於 Session 的快取中
3). 在資料庫中沒有對應的記錄
3. 持久化狀態(也叫”託管” )( Persist)
1).
OID 不為 null
2). 位於 Session 快取中
3). 若在資料庫中已經有和其對應的記錄 , 持久化物件和資料庫中的相關記錄對應
4).
Session 在 flush 快取時 , 會根據持久化物件的屬性變化 , 來同步更新資料庫
5). 在同一個 Session 例項的快取中 , 資料庫表中的每條記錄只對應唯一的持久化物件( Session 快取物件的 OID 不能重複)
@Test
public void testOID(){
News news2 = (News ) session.get (News.class , 1);
System.out.println (news2 );
News news = new
News ();
news.setAuthor ("Oracle2" );
news.setContent ("Oracle
DB" );
news.setDate (new
Date ());
news.setTitle ("DB" );
news.setId (1 );
//丟擲異常: org.hibernate.NonUniqueObjectException
session.update (news );
}
4. 遊離狀態(也叫”脫管” ) (Detached ):
1).
OID 不為 null
2). 不再處於 Session 快取中
3). 一般情況需下 , 遊離物件是由持久化物件轉變過來的 , 因此在資料庫中可能還存在與它對應的記錄
5. 刪除狀態(Removed)
1). 在資料庫中沒有和其 OID 對應的記錄
2). 不再處於 Session 快取中
3). 一般情況下 , 應用程式不該再使用被刪除的物件
6. 狀態的轉換圖
7. get & load 的區別:
共同點:
get、load 從資料表中載入一個物件 , 載入後即為持久化狀態的物件
不同點:
get: 立即查詢資料表. 若沒有對應的記錄 , 返回 null ;
load: 延遲查詢資料表 . 直到第一次使用該物件時 , 再進行查詢,
先返回的是一個代理物件 . 若沒有對應的記錄 ,並且使用了該物件 , 則會丟擲org.hibernate.ObjectNotFoundException 異常
8. update 方法:
@Test
public void testUpdate(){
News news = (News ) session.get (News.class , 1);
System.out.println (news );
transaction.commit ();
session.clear ();
session = sessionFactory.openSession ();
transaction = session.beginTransaction ();
//此時物件為遊離狀態
news.setAuthor ("Oracle" );
//update 可以使遊離物件變為持久化物件 .
//通常需要傳送一條 UPDATE 語句
//若物件即為持久化物件 , 則不需要呼叫 update() 方法
session.update (news );
}
注意:
1) . 使用場景: B\S 專案中從頁面傳過來一個物件,需要對其進行更新時,即呼叫 update()方法
2) . 若資料表中沒有物件對應的記錄,還要執行 update() 方法,則會丟擲異常: org.hibernate.StaleObjectStateException
9. saveOrUpdate (): 儲存或更新
11. delete ():刪除一個物件對應的記錄。
1). 若只想刪除指定的物件,設定 ID 即可。
2). 若資料表中沒有對應的記錄,則丟擲異常: java.lang.IllegalArgumentException
12. Hibernate 呼叫原生的 JDBC
API:
session.doWork(new
Work() {
@Override
public void execute(Connection
connection ) throws SQLException {
//使用 JDBC 原生的 API
}
});
相關文章
- Hibernate物件狀態物件
- 事務狀態持久化持久化
- Zustand:狀態持久化在專案中的應用持久化
- Hibernate註解(一)之持久化實體持久化
- SAP 電商雲 UI State persistence 狀態持久化設計的入口 - initSyncUI持久化
- GPUDepthStencilState物件設定depthStencil狀態GPU物件
- 物件和函式的區別就是物件可以儲存狀態物件函式
- Java序列化的狀態Java
- 狀態變化模式模式
- Java的型別化狀態機Java型別
- [二、狀態管理]2管理元件擁有的狀態(5)@Observed裝飾器和@ObjectLink裝飾器:巢狀類物件屬性變化元件Object巢狀物件
- Redis資料持久化—RDB持久化與AOF持久化Redis持久化
- 用非常硬核的JAVA序列化手段實現物件流的持久化儲存Java物件持久化
- Redis的持久化Redis持久化
- Redis 的持久化Redis持久化
- 物件導向程式設計和根本狀態物件程式設計
- RDD持久化,不使用RDD持久化的問題的工作原理持久化
- kubernetes資料持久化StorageClass動態供給(二)持久化
- redis系列:RDB持久化與AOF持久化Redis持久化
- Redis的持久化方案Redis持久化
- Redis的持久化策略Redis持久化
- Redis的持久化方式Redis持久化
- CRM下載物件一直處於Wait狀態的原因物件AI
- 關於前端元件化、狀態管理規範化的思考前端元件化
- 使用 Hooks 簡化受控元件的狀態繫結Hook元件
- Hibernate (開源物件關係對映框架)物件框架
- [Redis]持久化Redis持久化
- Docker 持久化Docker持久化
- redis持久化Redis持久化
- Redis - 持久化Redis持久化
- Redis 持久化Redis持久化
- redisaof持久化Redis持久化
- 資料的序列化&持久化持久化
- redis的持久化機制Redis持久化
- Redis的資料持久化Redis持久化
- Redis的持久化設計Redis持久化
- SpringCloud使用Sentinel,Sentinel持久化,Sentinel使用nacos持久化SpringGCCloud持久化
- 全面解析RayFire的動態物件與靜態物件物件
- 手把手教你實現json巢狀物件的正規化化和反正規化化JSON巢狀物件