Hibernate入門(四)之持久化對象的三種狀態(tài)

持久化對象的三種狀態(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)間的轉換,具體如下:

  1. 瞬時態(tài)對象換到其他狀態(tài)
  • 瞬時態(tài)轉換為持久態(tài):執(zhí)行Session的save()或saveOrUpdate()方法。
  • 瞬時態(tài)轉換為脫管態(tài):為瞬時態(tài)對象設置持久化標識OID。
  1. 持久態(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方法用于清除一級緩存的所有對象。
  1. 脫管態(tài)對象轉換到其他狀態(tài)。脫管態(tài)對象無法直接獲得,是由其他狀態(tài)轉換而來的。
  • 脫管態(tài)轉換為瞬時態(tài):將脫管對象的持久化標識OID設為null。
  • 脫管態(tài)轉換為持久態(tài):執(zhí)行Session的update()、saveOrUpdate()或lock()方法。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Hibernate的持久化類 什么是持久化類 持久化類:就是一個Java類(JavaBean),并且這個【Java...
    Michael_林閱讀 694評論 0 1
  • 1.PO 狀態(tài)及轉換 PO(Persistent Object):持久化對象,主要作用是把內存中的數(shù)據(jù)保存到可永久...
    SawyerZh閱讀 1,292評論 2 6
  • 本文包括:1、Hibernate的持久化類2、Hibernate 持久化對象的三個狀態(tài)(難點)3、Hibernat...
    廖少少閱讀 1,588評論 0 13
  • 一、hibernate持久化對象狀態(tài)(一級緩存)持久化對象 Persistent Object = POJO +...
    luweicheng24閱讀 268評論 0 0
  • 現(xiàn)代企業(yè)人才競爭日益激烈,員工培訓課程的重要性不言而喻。日本經(jīng)營之神松下幸之助曾經(jīng)深刻感受到:培訓很貴,不培訓更貴...
    fengtian89閱讀 784評論 0 0

友情鏈接更多精彩內容