1. 程式人生 > >java物件中的三種狀態和髒檢查及重新整理快取機制

java物件中的三種狀態和髒檢查及重新整理快取機制

瞬時狀態

  瞬時狀態又稱臨時狀態.如果java物件與資料庫中的資料沒有任何的關聯,即此java物件在資料庫中沒有相關聯的記錄,此時java物件的狀態為瞬時狀態,session對於

瞬時狀態的ava物件是一無所知的,當物件不再被其他物件引用時,它的所有資料也就丟失了,物件將會被java虛擬機器按照垃圾回收處理

持久狀態

  當物件與session關聯,被session管理時,它就處於持久狀態.處於直接狀態的物件擁有資料庫識別符號(資料庫中主鍵的值).那麼,物件是什麼時候與session發生關聯呢?

  1. 通過session查詢介面,或者get()方法,或者load()方法從資料庫中載入物件的時候,載入的物件是與資料庫表中的一條記錄關聯的,此時物件與載入它的session發生關聯,
  2. 對瞬時狀態的物件呼叫session的save(),saveOrUpdate()等方法時,在儲存物件資料的同事,java物件的內部狀態發生了任何變更,hibernate會選擇合適的時間(如事務提交時)將變成同步到資料庫中

遊離狀態

  遊離狀態又稱託管狀態,處於持久狀態的物件,脫離與其關聯的session的管理後,物件就處於遊離狀態.處於遊離狀態的物件,hibernate無法保證物件所包含的數與資料

庫中的記錄一致,因為hibernate以及無法感知對該物件的任何操作.session提供了update(),saveOrupdate()等方法,將處於遊離狀態的物件數以更新的方式同步到資料庫中

,並將該物件與當前的session關聯.這時,對的狀態就從遊離狀態重新轉換為持久狀態

三種狀態之間的轉換

  1. 瞬時轉持久

    1. 使用session的save(),saveOrUpdate()等方法儲存物件後,該物件的狀態由誰是狀態轉換為持久狀態
    2. 使用session的get()或load()方法獲取物件,該物件的狀態是持久狀態
  2. 持久轉瞬時

    1. 執行session的delete()方法後,物件由原來的持久狀態變為瞬時,因為此時該物件沒有與任何資料庫關聯
  3. 持久轉游離

    1. 執行session的evict(),clear()或close()方法,物件由原來的持久狀態轉為遊離
  4. 遊離轉持久

    1. 執行session的update()或saveOrUpdate()方法,物件由遊離轉為持久,該物件再次與當前session相關聯
  5. 遊離轉瞬時

     1.執行session的delete方法,物件由遊離轉為瞬時

注意:處於瞬時或遊離的物件不再被其他物件引用時,會被JVM按照垃圾回收機制處理

髒檢查

  在hibernate中,資料前後發生變化的物件,稱為髒物件.

tx= HibernateUtil.currentSession().beginTransaction();
//獲取員工物件,此時物件處於持久狀態
Emp empUpdate = empDao.update(7900);
//修改後,資訊和之前不同,此時 empUpdate物件成為"髒物件"
empUpdate.setSal(6666);
//提交事務
tx.commit();

  以上程式碼中empUpdate物件處於持久狀態,當物件被加入session快取中時,session會為物件的值型別的屬性複製一份快照

重新整理快取機制