持久化對象的三種狀態(tài)概述
Hibernate為了更好的管理持久化類,將持久化類分成了三種狀態(tài)。
瞬時態(tài)(transient)
瞬時態(tài)也被稱為臨時態(tài)或自由態(tài),瞬時態(tài)的實例是由new命令創(chuàng)建、開辟內存空間的對象,不存在持久化表示OID(相當于主鍵值),尚未與Hibernate Session關聯(lián),在數(shù)據(jù)庫中也沒有記錄,失去引用后將被JVM回收。瞬時態(tài)在內存中是孤立存在的,與數(shù)據(jù)庫中的數(shù)據(jù)無任何關聯(lián),僅是一個信息攜帶的載體。持久態(tài)(persistent)
持久態(tài)對象存在持久化標識OID,加入到了Session緩存中,并且相關聯(lián)的Session沒有關閉,在數(shù)據(jù)庫中有對應的記錄,每條記錄只對應唯一的持久化對象,需要注意的是,持久態(tài)對象是在事物還未提交前編程持久態(tài)的。脫管態(tài)(detached)
脫管態(tài)也稱離線態(tài)或游離態(tài),當某個持久化狀態(tài)的實例與Session的關聯(lián)被關閉時就編程了脫管態(tài)。脫管態(tài)對象存在持久化表示OID,并且仍然與數(shù)據(jù)庫中的數(shù)據(jù)存在關聯(lián),只是失去了與當前Session的關聯(lián),托管狀態(tài)對象發(fā)生改變時Hibernate不能檢測到。
代碼演示三種狀態(tài):
public static void main(String[] args) {
//1.讀取配置
Configuration config = new Configuration().configure();
//2.構建Session工廠類
SessionFactory sessionFactory = config.buildSessionFactory();
//3.獲取session對象
Session session = sessionFactory.openSession();
//4.開啟事務
Transaction transaction = session.beginTransaction();
//5.創(chuàng)建持久化類對象
Customer customer = new Customer(); //此時處于瞬時態(tài) 未與session關聯(lián),沒有OID
customer.setCust_name("GaoQiAn");
Serializable id = session.save(customer); //此時處于持久態(tài) 加入到Session緩存且關聯(lián)的Session未關閉,有OID
//7.提交事務
transaction.commit();
//8.釋放資源
session.close();
System.out.println(customer); //此時位于脫管態(tài) 存在持久化表示OID,只是失去了與當前Session的關聯(lián)
}
Hibernate持久化對象的三種狀態(tài)轉換
持久化對象的三種狀態(tài)可以通過調用Session中的一系列方法實現(xiàn)狀態(tài)間的轉換,具體如下:
- 瞬時態(tài)對象換到其他狀態(tài)
- 瞬時態(tài)轉換為持久態(tài):執(zhí)行Session的save()或saveOrUpdate()方法。
- 瞬時態(tài)轉換為脫管態(tài):為瞬時態(tài)對象設置持久化標識OID。
- 持久態(tài)對象轉換到其他狀態(tài)。持久化對象可以直接通過Hibernate中的Session的get()、load()方法,或者Query查詢從數(shù)據(jù)庫中獲得,持久態(tài)對象轉換到其他狀態(tài)總結如下:
- 持久態(tài)轉換到瞬時態(tài):執(zhí)行Session的delete()方法,需要注意的是被刪除的持久化對象,不建議再次使用。
- 持久態(tài)轉換到脫管態(tài):執(zhí)行Session的evict()、close()或Clear()方法。evict方法用于清除一級緩存中某一個對象;close方法用于關閉Session,清除一級緩存;clear方法用于清除一級緩存的所有對象。
- 脫管態(tài)對象轉換到其他狀態(tài)。脫管態(tài)對象無法直接獲得,是由其他狀態(tài)轉換而來的。
- 脫管態(tài)轉換為瞬時態(tài):將脫管對象的持久化標識OID設為null。
- 脫管態(tài)轉換為持久態(tài):執(zhí)行Session的update()、saveOrUpdate()或lock()方法。