Hibernate重附(Reattach)和合並(Merge)操作的比較

作者:狂放不羈
網址:http://yuquan.blog.51cto.com

>>>轉載請註明出處!<<<
 
Hibernate中將對象從託管狀態轉變爲持久化狀態可以採用兩種方法:重附(Reattach)和合並(Merge)。下面分別總結一下:
 
第一種:重附
重附操作使得一個託管對象重新受到persistence context的管理,具體可以採用兩種方法:
 
1 update方法,此方將實體對象從託管狀態轉變爲持久化狀態,但是需要注意的是如果當前的持久化上下文(persistence context)中已經存在了一個和託管對象有相同標識符的持久化對象就會拋出NonUniqueException,因爲在持久化上下文中,對數據庫表中的每一條記錄來說,都只能有一個對象與其對應,這樣方便持久化對象的髒檢測。此方法強制一個update語句,進行持久化對象與數據庫的同步。
 
2 lock方法。lock方法也用與將一個託管對象狀態轉化爲持久化,但是此方法的限制是在確保對象沒有被修改的情況下,如果在調用方法之前,修改了對象,那麼當事務提交的時候,修改是不會被傳播到數據庫裏的。
 
第2種:合併
所謂合併就是將託管對象的狀態複製到持久化對象裏,然後生產一個新的持久化對象。並且合併還有一個作用就是可以將一個transient狀態的對象變爲persistent狀態。在合併操作裏,有兩種情況:
1 如果當前的持久化上下文種沒有與託管對象相同標識符的對象,那麼Hibernate隱式的調用select來查詢,如果數據庫種有記錄,那麼就將託管對象的狀態與新查詢到的對象進行合併,如果數據庫沒有對應的記錄,那麼就新建一個持久化對象,然後將託管對象的狀態複製到持久化對象裏。
2 如果持久化上下文種有與託管對象相同標識符的對象,那麼就將託管對象的狀態複製到持久化對象裏。(合併中需要注意的是原來託管的對象還是託管的,只不過merge返回的是一個新的持久化對象。)
 
 
需要注意的是JPA裏只支持合併,不支持重附。 <script type="text/javascript"></script>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章