Hibernate狀態 (merge,attachDirty,attachClean)

在Hibernate中的對象有三種狀態,即:
瞬時狀態(Transient)、持久狀態(Persistent)、脫管狀態(Detached)

1、瞬時狀態(Transient)
由new命令開闢內存空間的Java對象,也就是平時所熟悉的普通Java對象。

如:Person p = new Person();
瞬時對象特點:
(1)不和Session實例關聯
(2)在數據庫中沒有和瞬時對象關聯的記錄

2、持久狀態(Persistent)
持久的實例在數據庫中有對應的記錄,並擁有一個持久化標識(identifier).
持久對象總是與Session和Transaction相關聯,在一個Session中,對持久對象的改變不會馬上對數據庫進行變更,而必須在 Transaction終止,也就是執行commit()之後,纔在數據庫中真正運行SQL進行變更,持久對象的狀態纔會與數據庫進行同步。在同步之前的持久對象稱爲髒(dirty)對象。

瞬時對象轉爲持久對象:
(1) 通過Session的save()和saveOrUpdate()方法把一個瞬時對象與數據庫相關聯,這個瞬時對象就成爲持久化對象。
(2) 使用fine(),get(),load()和iterater()待方法查詢到的數據對象,將成爲持久化對象。

持久化對象的特點:
(1) 和Session實例關聯
(2) 在數據庫中有和持久對象關聯的記錄

3、脫管狀態(Detached)
與持久對象關聯的Session被關閉後,對象就變爲脫管對象。對脫管對象的引用依然有效,對象可繼續被修改。
脫管對象特點:
(1) 本質上和瞬時對象相同
(2) 只是比愛瞬時對象多了一個數據庫記錄標識值id.
持久對象轉爲脫管對象:
當執行close()或clear(),evict()之後,持久對象會變爲脫管對象。

瞬時對象轉爲持久對象:
通過Session的update(),saveOrUpdate()和lock()等方法,把脫管對象變爲持久對象。


==================================================================================
merge(): 調用merge()函數
將傳入的detached狀態的對象的屬性複製到持久化對象中,並返回該持久化對象。如果該session中沒有關聯的持久化對象,加載一個,如果傳入對象未保存,保存一個副本並作爲持久對象返回,傳入對象依然保持detached狀態。

attachDirty(): 調用saveOrUpdate()函數
將傳入的對象持久化並保存。如果對象未保存(Transient狀態),調用save方法保存。如果對象已保存(Detached狀態),調用update方法將對象與Session重新關聯。

attachClean(): 調用lock()函數
將傳入的對象狀態設置爲Transient狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章