一、綜述
hibernate中的對象有三種狀態,分別是TransientObjects(瞬時對象)、PersistentObjects(持久化對象)和DetachedObjects(托管對象也叫做離線對象)。
二、Hibernate對象三種狀態轉化圖:
三、Hibernate對象三種狀態簡介及轉化條件:
(1)臨時狀態:
由Java的new命令開辟內存空間的java對象也就是普通的java對象,如果沒有變量引用它它將會被JVM收回。簡單的說就是程序里面new一個對象,還沒有和session關聯
(1.1)臨時狀態——>持久化狀態:
臨時對象在內存中是孤立存在的,它的意義是攜帶信息載體,不和數據庫中的數據由任何的關聯。通過Session的save()方法和saveOrUpdate()方法可以把一個臨時對象和數據庫相關聯,並把臨時對象攜帶的信息通過配置文件所做的映射插入數據庫中,這個臨時對象就成為持久化對象。
(2)持久化狀態:
對象和session有了關聯,對象處於hibernate框架管理中.持久化對象在數據庫中都有相應的記錄,持久化對象可以是剛剛被保存的,也可以是調用get或者load方法剛剛加載的,但都是在相關聯的session生命周期中保存這個狀態。如果是直接從數據庫中查詢所返回的數據對象,那這些對象和數據庫中的字段相關聯,具有相同的id,他們馬上變成持久化對象。如果一個臨時對象被持久化對象引用,也馬上會變為持久化對象。
(2.1)持久化狀態——>臨時狀態
使用delete()方法,持久化對象變為臨時對象,並且刪除數據庫中相應的記錄,這個對象不再與數據庫有任何的聯系。
(2.2)持久化狀態——>離線對象
當一個session()執行close()、clear()、或evict()之后,持久化對象就變為離線對象,這時對象的id雖然擁有數據庫的識別值,但已經不在Hibernate持久層的管理下,他和臨時對象基本上一樣的,只不過比臨時對象多了數據庫標識id。沒有任何變量引用時,jvm將對其進行回收。
持久化對象總是與Session和事務(Transaction)關聯在一起,在一個session中,對持久化對象的操作不會立即寫到數據庫,只有當Transaction(事務)結束時也就是提交事務執行commit方法的時候,才真正的對數據庫更新,從而完成持久化對象和數據庫的同步。在同步之前的持久化對象成為臟對象。
(3)托管對象(離線狀態):
在持久態的情況下,對象和session失去了關聯,比如session.close()或session.evite(obj) 后,即游離態,但數據已經存儲到了數據庫。Session關閉之后,與此Session關聯的持久化對象就變成為脫管對象,可以繼續對這個對象進行修改,如果脫管對象被重新關聯到某個新的Session上,會在此轉成持久對象。脫管對象雖然擁有用戶的標識id,所以通過update()、saveOrUpdate()等方法,再次與持久層關聯。
(3.2)離線狀態——>臨時狀態
執行Delete方法。
四、代碼演示:
日志記錄: