|
初學(xué)hibernate時(shí),對(duì)于session中的update()和merge()兩個(gè)方法,很容易搞混,覺得兩種都能用,有時(shí)候,又覺得不知道該用哪一種。 實(shí)際上,這兩個(gè)方法,是有很大區(qū)別的 首先,對(duì)于一個(gè)處于detatch狀態(tài)的實(shí)體對(duì)象來說,要將其中的修改,合并到數(shù)據(jù)庫中,有兩種方法,一種方式,是調(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ù)庫中。 當(dāng)調(diào)用merge()對(duì)象時(shí),無需考慮session中是否已經(jīng)包含同樣id的實(shí)體對(duì)象,如果session中沒有同樣id的實(shí)體對(duì)象,hibernate會(huì)通過select語句,從數(shù)據(jù)庫中查詢出對(duì)應(yīng)對(duì)象,如果數(shù)據(jù)庫中沒有對(duì)應(yīng)對(duì)象,就新建一個(gè)。同時(shí),完成merge()操作后,會(huì)返回?cái)?shù)據(jù)庫中對(duì)應(yīng)的persistent狀態(tài)對(duì)象,而原有的,作為參數(shù)傳入的實(shí)體對(duì)象,仍然是detatch狀態(tài),后續(xù)代碼對(duì)其的修改,無法合并到數(shù)據(jù)庫中。 |
|
|