save()方法很顯然是執行保存操作的,如果是對一個新的剛new出來的對象進行保存,自然要使用這個方法了,數據庫中沒有這個對象。
update()如果是對一個已經存在的托管對象進行更新那么肯定是要使用update()方法了,數據中有這個對象。
saveOrUpdate()這個方法是更新或者插入,有主鍵就執行更新,如果沒有主鍵就執行插入。
區別:對於一個從托管狀態到瞬態的對象(對於一個從數據庫中取出來又被刪除的對象),這個對象本身是有主鍵的,但是因為被刪除了,
所以這個時候因為數據庫中已經沒有了這條記錄了。不過它還有主鍵存在,所以這個時候不可以使用update()或者是saveOrUpdate(),
因為update()方法是認為數據庫中肯定有這條記錄的,而saveOrUpdate的執行過程就是先查看這個對象是不是有主鍵,有主鍵那么就執行
update()方法,沒有主鍵就執行save()方法,因此結果跟調用了update()方法的效果是一樣的,結果就會出錯,因為這個對象已經被刪除了,
數據庫中已經沒有這條記錄了,只是它還有主鍵而已(僅僅是存在於內存中),因此這個時候要執行的是save()方法。
**********************************************************************************************
一、save()和persist()將會引發SQL的INSERT,delete()會引發SQLDELETE,
而update()或merge()會引發SQL UPDATE。對持久化(persistent)實例的修改在刷新提交的時候會被檢測到,它也會引起SQL UPDATE。
saveOrUpdate()或者replicate()會引發SQLINSERT或者UPDATE
二、save 和update區別
把這一對放在第一位的原因是因為這一對是最常用的。
save的作用是把一個新的對象保存
update是把一個脫管狀態的對象或自由態對象(一定要和一個記錄對應)更新到數據庫
三、update 和saveOrUpdate區別
這個是比較好理解的,顧名思義,saveOrUpdate基本上就是合成了save和update,而update只是update;引用hibernate reference中的一段話來解釋他們的使用場合和區別
通常下面的場景會使用update()或saveOrUpdate():
程序在第一個session中加載對象,接着把session關閉
該對象被傳遞到表現層
對象發生了一些改動
該對象被返回到業務邏輯層最終到持久層
程序創建第二session調用第二個session的update()方法持久這些改動
********************************************************************************************************************
