hibernate中的對象有三種狀態,分別是TransientObjects(瞬時對象)、PersistentObjects(持久化對象)和DetachedObjects(託管對象也叫作離線對象)。java
(1)臨時狀態:mysql
由Java的new命令開闢內存空間的java對象也就是普通的java對象,若是沒有變量引用它它將會被JVM收回。簡單的說就是程序裏面new一個對象,尚未和session關聯web
(1.1)臨時狀態——>持久化狀態:sql
臨時對象在內存中是孤立存在的,它的意義是攜帶信息載體,不和數據庫中的數據由任何的關聯。經過Session的save()方法和saveOrUpdate()方法能夠把一個臨時對象和數據庫相關聯,並把臨時對象攜帶的信息經過配置文件所作的映射插入數據庫中,這個臨時對象就成爲持久化對象。數據庫
(2)持久化狀態:緩存
對象和session有了關聯,對象處於hibernate框架管理中.持久化對象在數據庫中都有相應的記錄,持久化對象能夠是剛剛被保存的,也能夠是調用get或者load方法剛剛加載的,但都是在相關聯的session生命週期中保存這個狀態。若是是直接從數據庫中查詢所返回的數據對象,那這些對象和數據庫中的字段相關聯,具備相同的id,他們立刻變成持久化對象。若是一個臨時對象被持久化對象引用,也立刻會變爲持久化對象。session
(2.1)持久化狀態——>臨時狀態app
使用delete()方法,持久化對象變爲臨時對象,而且刪除數據庫中相應的記錄,這個對象再也不與數據庫有任何的聯繫。框架
(2.2)持久化狀態——>離線對象jvm
當一個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方法。
日誌記錄: