初學(xué)hibernate時(shí),對(duì)于session中的update()和merge()兩個(gè)方法,很容易搞混,覺(jué)得兩種都能用,有時(shí)候,又覺(jué)得不知道該用哪一種。 實(shí)際上,這兩個(gè)方法,是有很大區(qū)別的 首先,對(duì)于一個(gè)處于detatch狀態(tài)的實(shí)體對(duì)象來(lái)說(shuō),要將其中的修改,合并到數(shù)據(jù)庫(kù)中,有兩種方法,一種方式,是調(diào)用update(),另一種方式是調(diào)用merge() 當(dāng)調(diào)用update()時(shí),首先要取保目標(biāo)session中,不包含同樣id的實(shí)體對(duì)象的引用,如果有的話,會(huì)拋出異常,完成update()方法后,這個(gè)實(shí)體對(duì)象從detatch狀態(tài),轉(zhuǎn)換為persistent狀態(tài),在session提交前,后續(xù)對(duì)其的修改,都會(huì)被合并到數(shù)據(jù)庫(kù)中。 當(dāng)調(diào)用merge()對(duì)象時(shí),無(wú)需考慮session中是否已經(jīng)包含同樣id的實(shí)體對(duì)象,如果session中沒(méi)有同樣id的實(shí)體對(duì)象,hibernate會(huì)通過(guò)select語(yǔ)句,從數(shù)據(jù)庫(kù)中查詢出對(duì)應(yīng)對(duì)象,如果數(shù)據(jù)庫(kù)中沒(méi)有對(duì)應(yīng)對(duì)象,就新建一個(gè)。同時(shí),完成merge()操作后,會(huì)返回?cái)?shù)據(jù)庫(kù)中對(duì)應(yīng)的persistent狀態(tài)對(duì)象,而原有的,作為參數(shù)傳入的實(shí)體對(duì)象,仍然是detatch狀態(tài),后續(xù)代碼對(duì)其的修改,無(wú)法合并到數(shù)據(jù)庫(kù)中。 |
|
來(lái)自: 為什么圖書(shū)館13 > 《待分類》