初學hibernate時,對于session中的update()和merge()兩個方法,很容易搞混,覺得兩種都能用,有時候,又覺得不知道該用哪一種。
實際上,這兩個方法,是有很大區(qū)別的
首先,對于一個處于detatch狀態(tài)的實體對象來說,要將其中的修改,合并到數(shù)據(jù)庫中,有兩種方法,一種方式,是調(diào)用update(),另一種方式是調(diào)用merge()
當調(diào)用update()時,首先要取保目標session中,不包含同樣id的實體對象的引用,如果有的話,會拋出異常,完成update()方法后,這個實體對象從detatch狀態(tài),轉(zhuǎn)換為persistent狀態(tài),在session提交前,后續(xù)對其的修改,都會被合并到數(shù)據(jù)庫中。
當調(diào)用merge()對象時,無需考慮session中是否已經(jīng)包含同樣id的實體對象,如果session中沒有同樣id的實體對象,hibernate會通過select語句,從數(shù)據(jù)庫中查詢出對應(yīng)對象,如果數(shù)據(jù)庫中沒有對應(yīng)對象,就新建一個。同時,完成merge()操作后,會返回數(shù)據(jù)庫中對應(yīng)的persistent狀態(tài)對象,而原有的,作為參數(shù)傳入的實體對象,仍然是detatch狀態(tài),后續(xù)代碼對其的修改,無法合并到數(shù)據(jù)庫中。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。