Hibernate的PO對象有三種狀態:臨時狀態(又稱臨時態)、持久狀態(又稱為持久態)和脫管狀態(又稱為脫管態、游離態)。處理持久態的對象也稱為PO,臨時對象和脫管對象也稱為VO。
1、臨時態:
簡單來說,由new命令開辟內存空間時剛生成的java對象就是處於臨時態。
比如:
User user = new User();
如果沒有變量對該對象進行引用,它將被java虛擬機回收。
臨時對象在內存中是孤立存在的,它是攜帶信息的載體,不和數據庫的數據有任何關聯關系。在hibernate中,可以通過Session的save()或者savaOrUpdate()方法將臨時對象與數據庫相關聯,並插入數據庫,轉變成持久化對象。
2、持久態:
持久化狀態,該對象在數據庫中具有對應的一條記錄,並擁有一個持久化標識(如:Integer id 其實對應的就是記錄表的一個主鍵)。如果hibernate 中的Dao層方法delete(),就會把對應的持久化對象變為臨時對象,對應數據庫中的記錄也會被刪除,不再與數據庫的記錄關聯。
總結一下,持久化對象特點:
(1)和Session實例關聯;
(2)與數據庫中有與之關聯的記錄;
3、脫管態(游離態):
當與某持久化對象關聯的Session被關閉後,該持久化對象轉變為脫管對象。脫管對象被重新關聯到Session上時,將再次轉變成持久化對象。
注意:脫管對象擁有數據庫的識別值,可通過update()、savaOrUpdate()等方法,轉變成持久對象。
脫管對象特點:
(1)本質上與臨時對象相同,在沒有任何變量引用它時,JVM會在核實的時候將它回收;
(2)比臨時對象多了一個數據庫記錄標識值;
4、Session中常用方法對PO對象狀態的作用
臨時狀態、持久化狀態和脫管狀態(也就是游離狀態),三種狀態轉化的方法都是通 過session來調用,瞬態到持久態的方法有save()、saveOrUpdate()、get()、load();持久態到瞬態的方法有 delete();游離態到持久態的方法有update()、saveOrUpdate()、lock();持久態到游離態的方法 有:session.close()、session.evict()、session.clear()。
5、save()和update()的區別
save()的作用是保存一個新的對象,update()可以把一個脫管狀態的對象(一定要和一個記錄對應)更新到數據庫。
6、update()和saveOrUpdate()區別
saveOrUpdate()方法基本上就是合成了save()和update()
通常下面的場景會使用到update()和saveOrUpdate()::
(1)程序在第一個Session中加載對象,接著把Session()關閉;
(2)該對象被傳遞到表示層;
(3)對象發生了一些改動;
(4)該對象被返回到業務邏輯層最終到達持久層;
(5)程序創建第二個Session,調用第二個Session的update()方法持久化這些改動。
Hibernate整體理解 http://www.linuxidc.com/Linux/2014-07/104405.htm
Hibernate的映射機制 http://www.linuxidc.com/Linux/2014-12/110265.htm
Hibernate 的詳細介紹:請點這裡
Hibernate 的下載地址:請點這裡