瞬時(transient):數據庫中沒有數據與之對應,超過作用域會被JVM垃圾回收器回收,一般是new出來且與session沒有關聯的對象;
持久(persistent):數據庫中有數據與之對應,當前與session有關聯,并且相關聯的session沒有關閉,事務沒有提交;持久對象狀態發生改變,在事務提交時會影響到
數據庫(Hibernate能檢測到);
脫管(detached):數據庫中有數據與之對應,但當前沒有session與之關聯;托管對象狀態發生改變,Hibernate不能檢測到。

如上圖所示,當我們new處一個user時,這個對象是瞬時的;(與數據庫、session均無關系)
當我們用save方法使user對象保存到session時,這時對象是持久的;
當user對象發生變化,如執行commit語句,user對象的變化都會反映在數據庫中。(數據庫中有數據對應,在session管理之中)
當調用close語句后,user對象從session中出來,此時對象是脫管的。(數據庫中有數據對應,但與session沒關系了)
以下實例說明以上三種實體對象狀態




























































執行該程序 觀察控制臺輸出
再查看數據庫中user表內容
發現持久對象的狀態改變Hibernate能知道,會在數據庫中得到反映。
脫管對象的狀態如果想將其狀態反映到數據庫中,可以調用session的update方法。
當我們不知道對象是瞬時的還是脫管的,可以調用session的saveOrUpdate方法,由Hibernate自己(根據對象的id是否有值)判定處理。
調用saveOrUpdate保存對象,對象將變成持久的,而調用merge方法對象還是脫管的。
對象調用setName等方法,數據庫并不會立即更新,而是到執行commit語句后才更新。盡量延遲和數據庫的交互。
補充:三種對象轉換關系圖