Hibernate 持久化物件的狀態
什麼是持久化類
1. 持久化類:就是一個Java類(我們們編寫的JavaBean),這個Java類與表建立了對映關係就可以成為是持久化類。
* 持久化類 = JavaBean + xxx.hbm.xml
持久化類的編寫規則
1. 提供一個無引數 public訪問控制符的構造器 -- 底層需要進行反射.
2. 提供一個標識屬性,對映資料表主鍵欄位 -- 唯一標識OID.資料庫中通過主鍵.Java物件通過地址確定物件.持久化類通過唯一標識 OID確定記錄
3. 所有屬性提供public訪問控制符的 set或者get 方法
4. 標識屬性應儘量使用基本資料型別的包裝型別
Hibernate 持久化物件的狀態
1. Hibernate的持久化類
* 持久化類:Java類與資料庫的某個表建立了對映關係.這個類就稱為是持久化類.
* 持久化類 = Java類 + hbm的配置檔案
2. Hibernate的持久化類的狀態
* Hibernate為了管理持久化類:將持久化類分成了三個狀態
* 瞬時態:Transient Object
* 沒有持久化標識OID, 沒有被納入到Session物件的管理.
* 持久態:Persistent Object
* 有持久化標識OID,已經被納入到Session物件的管理.
* 脫管態:Detached Object
* 有持久化標識OID,沒有被納入到Session物件的管理.
Hibernate 持久化物件的狀態的轉換
1. 瞬時態 -- 沒有持久化標識OID, 沒有被納入到Session物件的管理
* 獲得瞬時態的物件
* User user = new User()
* 瞬時態物件轉換持久態
* save()/saveOrUpdate();
* 瞬時態物件轉換成脫管態
* user.setId(1)
2. 持久態 -- 有持久化標識OID,已經被納入到Session物件的管理
* 獲得持久態的物件
* get()/load();
* 持久態轉換成瞬時態物件
* delete(); --- 比較有爭議的,進入特殊的狀態(刪除態:Hibernate中不建議使用的)
* 持久態物件轉成脫管態物件
* session的close()/evict()/clear();
3. 脫管態 -- 有持久化標識OID,沒有被納入到Session物件的管理
* 獲得託管態物件:不建議直接獲得脫管態的物件.
* User user = new User();
* user.setId(1);
* 脫管態物件轉換成持久態物件
* update();/saveOrUpdate()/lock();
* 脫管態物件轉換成瞬時態物件
* user.setId(null);
4. 注意:持久態物件有自動更新資料庫的能力!!!
程式碼示例:
package com.kunaly.test;
import java.io.Serializable;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.kunaly.domain.User;
import com.kunaly.utils.HibernateUtils;
/**
* 持久化物件的三種狀態
* @author Administrator
*
*/
public class Demo03 {
@Test
public void run1() {
// 獲取session
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
// 持久User的物件
// 瞬時態: 沒有OID的值,也沒有被session管理,此時的user物件是瞬時態物件
User user = new User();
user.setName("張飛");
user.setAge(38);
// 使用session儲存使用者
// user物件中已經存在id的值,沒預設情況下,把user物件也儲存到session的快取中
Serializable id = session.save(user);
System.out.println("主鍵的值是"+id);
// user 是持久態物件
tr.commit();
// session銷燬,快取沒有了
session.close();
// 列印
// user物件存在id值,但是session銷燬了,快取不存在。
//session還管理user物件?廢話,session都死了,還管理個屁啊
//此時的user是託管態的物件
System.out.println(user.getId());
System.out.println(user.getName());
}
/**
* 持久態的物件有自動更新資料庫的能力
*/
@Test
public void run2() {
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
// 獲取持久態的物件
User user = session.get(User.class,1);
System.out.println(user.getName());
// user 是持久態,有自動更新資料庫的能力
// 重新設定新的名稱
user.setName("劉玄德");
System.out.println(user.getName());
tr.commit();
session.close();
}
}
相關文章
- Hibernate持久化物件的狀態持久化物件
- Hibernate物件狀態物件
- 事務狀態持久化持久化
- hibernate中po物件的三種狀態分析物件
- Hibernate的三種狀態及物件生命週期物件
- 菜鳥學SSH(八)——Hibernate物件的三種狀態物件
- Zustand:狀態持久化在專案中的應用持久化
- 物件持久化問題物件持久化
- Java Hibernate 之 Session 狀態JavaSession
- SAP 電商雲 UI State persistence 狀態持久化設計的入口 - initSyncUI持久化
- 領域物件裡有個屬性的型別是介面,如何用hibernate持久化物件型別持久化
- 關於物件持久化的問題物件持久化
- 值物件是否需要持久化物件持久化
- 深入理解hibernate的三種狀態
- ViewModel:持久化、onSaveInstanceState()、UI 狀態恢復和 LoaderView持久化UI
- Hibernate註解(一)之持久化實體持久化
- SSH框架之-hibernate 三種狀態的轉換框架
- 處理物件的多種狀態及其相互轉換——狀態模式(五)物件模式
- 處理物件的多種狀態及其相互轉換——狀態模式(四)物件模式
- 處理物件的多種狀態及其相互轉換——狀態模式(一)物件模式
- GPUDepthStencilState物件設定depthStencil狀態GPU物件
- Java序列化的狀態Java
- Redis的兩種持久化方式-快照持久化(RDB)和AOF持久化Redis持久化
- 狀態變化模式模式
- 值物件持久化也用ManyToOne嗎?物件持久化
- 物件和函式的區別就是物件可以儲存狀態物件函式
- Redis資料持久化—RDB持久化與AOF持久化Redis持久化
- hibernate(二)一級快取和三種狀態解析快取
- 想用hibernate作資料持久的工作,可行嗎?
- android狀態列一體化(沉浸式狀態列)Android
- Redis 的持久化Redis持久化
- Redis的持久化Redis持久化
- 用非常硬核的JAVA序列化手段實現物件流的持久化儲存Java物件持久化
- [二、狀態管理]2管理元件擁有的狀態(5)@Observed裝飾器和@ObjectLink裝飾器:巢狀類物件屬性變化元件Object巢狀物件
- android狀態列一體化(改變狀態列的背景顏色)Android
- Java虛擬機器14:Java物件大小、物件記憶體佈局及鎖狀態變化Java虛擬機物件記憶體
- 物件導向程式設計和根本狀態物件程式設計
- Asp.NET系統狀態與物件管理ASP.NET物件