hibernate對於對象的保存提供了太多的方法
一
在所有之前
下邊是常見的翻譯辦法
transient
persistent
detached
脫管狀態的實例可以通過調用save()
持久化實例可以通過調用 delete()變成脫管狀態
脫管狀態的實例可以通過調用 update()
save()和persist()將會引發SQL的INSERT
而update()或merge()會引發SQLUPDATE
它也會引起SQLUPDATE
二
把這一對放在第一位的原因是因為這一對是最常用的
save的作用是把一個新的對象保存
update是把一個脫管狀態的對象保存
三
這個是比較好理解的
引用hibernate reference中的一段話來解釋他們的使用場合和區別
通常下面的場景會使用update()或saveOrUpdate()
程序在第一個session中加載對象
該對象被傳遞到表現層
對象發生了一些改動
該對象被返回到業務邏輯層
程序調用第二個session的update()方法持久這些改動
saveOrUpdate()做下面的事
如果對象已經在本session中持久化了
如果另一個與本session關聯的對象擁有相同的持久化標識(identifier)
如果對象沒有持久化標識(identifier)屬性
如果對象的持久標識(identifier)表明其是一個新實例化的對象
如果對象是附帶版本信息的(通過<version>或<timestamp>) 並且版本屬性的值表明其是一個新實例化的對象
否則update() 這個對象
四
這個是最迷離的一對
這裡給出一個明確的區分
這裡參考
I found that a lot of people have the same doubt
I
persist() is well defined
it doesn
instance immediately
that
persist() also guarantees that it will not execute an INSERT statement if it is
called outside of transaction boundaries
with an extended Session/persistence context
save() does not guarantee the same
has to be executed to get the identifier (e
this INSERT happens immediately
簡單翻譯一下上邊的句子的主要內容
到flush的時間
當我們通過繼承Session/persistence context來封裝一個長會話流程的時候
五
首先說明merge是用來代替saveOrUpdateCopy的
然後比較update和merge
update的作用上邊說了
如果session中存在相同持久化標識(identifier)的實例
如果session沒有相應的持久實例
用戶給出的這個對象沒有被關聯到session上
重點是最後一句
當我們使用update的時候
但當我們使用merge的時候
一個持久對象B
六
這兩個的區別好理解
update操作的是在脫管狀態的對象
而flush是操作的在持久狀態的對象
默認情況下
七
update是把一個已經更改過的脫管狀態的對象變成持久狀態
lock是把一個沒有更改過的脫管狀態的對象變成持久狀態
對應更改一個記錄的內容
update的操作步驟是
(
lock的操作步驟是
(
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28830.html