save()方法用於將一個臨時對象轉變為持久化對象,也就是將一個新的業務實體保存到數據庫中;
update()方法用於將一個游離對象重新轉變為持久化對象,也就是更新一個已經存在的業務實體到數據庫中;
saveOrUpdate()兼具了save()和update()方法的功能,該方法根據傳入參數的狀態執行不同的操作,當為臨時狀態時,調用save()方法;當為持久化狀態時,則直接返回;當為游離狀態時,調用update()方法。
merge()方法主要用於更新和保存實體,當實體不存在是,則執行保存操作,當實體已經存在時,執行更新操作,其實同saveOrUpdate()的功能是類似的。
1. update 和 merge的區別
首先在執行更新操作的時候,兩者都必須要有id
update是直接執行update 語句,執行后狀態為持久化狀態
而merge則不一樣:
1. 如果session中有與之對應的對象,也就是主鍵相同,則會把要保存的obj的值copy給session中的對象,然后update被復制后的session中的對象
2. 如果session中沒有,則會先從數據庫中select,然后把obj給查出來的對象copy,則update查出來的對象。
3. 所以merge會先select 再update
4. 所以merge后原來的對象obj狀態為脫管。
二、save 和update區別
把這一對放在第一位的原因是因為這一對是最常用的。
save的作用是把一個新的對象保存
update是把一個脫管狀態的對象或自由態對象(一定要和一個記錄對應)更新到數據庫
三、update 和saveOrUpdate區別
這個是比較好理解的,顧名思義,saveOrUpdate基本上就是合成了save和update,而update只是update;引用hibernate reference中的一段話來解釋他們的使用場合和區別
通常下面的場景會使用update()或saveOrUpdate():
程序在第一個session中加載對象,接着把session關閉
該對象被傳遞到表現層
對象發生了一些改動
該對象被返回到業務邏輯層最終到持久層
程序創建第二session調用第二個session的update()方法持久這些改動
saveOrUpdate(po)做下面的事:
如果該po對象已經在本session中持久化了,在本session中執行saveOrUpdate不做任何事
如果savaOrUpdate(新po)與另一個與本session關聯的po對象擁有相同的持久化標識(identifier),拋出一個異常
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.itfuture.www.po.Xtyhb#5]
saveOrUpdate如果對象沒有持久化標識(identifier)屬性,對其調用save() ,否則update() 這個對象