java物件中的三種狀態和髒檢查及重新整理快取機制
阿新 • • 發佈:2018-11-19
瞬時狀態
瞬時狀態又稱臨時狀態.如果java物件與資料庫中的資料沒有任何的關聯,即此java物件在資料庫中沒有相關聯的記錄,此時java物件的狀態為瞬時狀態,session對於
瞬時狀態的ava物件是一無所知的,當物件不再被其他物件引用時,它的所有資料也就丟失了,物件將會被java虛擬機器按照垃圾回收處理
持久狀態
當物件與session關聯,被session管理時,它就處於持久狀態.處於直接狀態的物件擁有資料庫識別符號(資料庫中主鍵的值).那麼,物件是什麼時候與session發生關聯呢?
- 通過session查詢介面,或者get()方法,或者load()方法從資料庫中載入物件的時候,載入的物件是與資料庫表中的一條記錄關聯的,此時物件與載入它的session發生關聯,
- 對瞬時狀態的物件呼叫session的save(),saveOrUpdate()等方法時,在儲存物件資料的同事,java物件的內部狀態發生了任何變更,hibernate會選擇合適的時間(如事務提交時)將變成同步到資料庫中
遊離狀態
遊離狀態又稱託管狀態,處於持久狀態的物件,脫離與其關聯的session的管理後,物件就處於遊離狀態.處於遊離狀態的物件,hibernate無法保證物件所包含的數與資料
庫中的記錄一致,因為hibernate以及無法感知對該物件的任何操作.session提供了update(),saveOrupdate()等方法,將處於遊離狀態的物件數以更新的方式同步到資料庫中
,並將該物件與當前的session關聯.這時,對的狀態就從遊離狀態重新轉換為持久狀態
三種狀態之間的轉換
-
瞬時轉持久
- 使用session的save(),saveOrUpdate()等方法儲存物件後,該物件的狀態由誰是狀態轉換為持久狀態
- 使用session的get()或load()方法獲取物件,該物件的狀態是持久狀態
-
持久轉瞬時
- 執行session的delete()方法後,物件由原來的持久狀態變為瞬時,因為此時該物件沒有與任何資料庫關聯
-
持久轉游離
- 執行session的evict(),clear()或close()方法,物件由原來的持久狀態轉為遊離
-
遊離轉持久
- 執行session的update()或saveOrUpdate()方法,物件由遊離轉為持久,該物件再次與當前session相關聯
-
遊離轉瞬時
1.執行session的delete方法,物件由遊離轉為瞬時
注意:處於瞬時或遊離的物件不再被其他物件引用時,會被JVM按照垃圾回收機制處理
髒檢查
在hibernate中,資料前後發生變化的物件,稱為髒物件.
tx= HibernateUtil.currentSession().beginTransaction(); //獲取員工物件,此時物件處於持久狀態 Emp empUpdate = empDao.update(7900); //修改後,資訊和之前不同,此時 empUpdate物件成為"髒物件" empUpdate.setSal(6666); //提交事務 tx.commit();
以上程式碼中empUpdate物件處於持久狀態,當物件被加入session快取中時,session會為物件的值型別的屬性複製一份快照
重新整理快取機制