五,saveOrUpdateCopy,merge和update區(qū)別
首先說明merge是用來代替saveOrUpdateCopy的,這個(gè)詳細(xì)見這里 http://www./dreamstone/archive/2007/07/28/133053.html 然后比較update和merge update的作用上邊說了,這里說一下merge的 如果session中存在相同持久化標(biāo)識(shí)(identifier)的實(shí)例,用用戶給出的對(duì)象的狀態(tài)覆蓋舊有的持久實(shí)例 如果session沒有相應(yīng)的持久實(shí)例,則嘗試從數(shù)據(jù)庫中加載,或創(chuàng)建新的持久化實(shí)例,最后返回該持久實(shí)例 用戶給出的這個(gè)對(duì)象沒有被關(guān)聯(lián)到session上,它依舊是脫管的 重點(diǎn)是最后一句: 當(dāng)我們使用update的時(shí)候,執(zhí)行完成后,我們提供的對(duì)象A的狀態(tài)變成持久化狀態(tài) 但當(dāng)我們使用merge的時(shí)候,執(zhí)行完成,我們提供的對(duì)象A還是脫管狀態(tài),hibernate或者new了一個(gè)B,或者檢索到 一個(gè)持久對(duì)象B,并把我們提供的對(duì)象A的所有的值拷貝到這個(gè)B,執(zhí)行完成后B是持久狀態(tài),而我們提供的A還是托管狀態(tài) 六,flush和update區(qū)別 這兩個(gè)的區(qū)別好理解 update操作的是在脫管狀態(tài)的對(duì)象 而flush是操作的在持久狀態(tài)的對(duì)象。 默認(rèn)情況下,一個(gè)持久狀態(tài)的對(duì)象是不需要update的,只要你更改了對(duì)象的值,等待hibernate flush就自動(dòng)保存到數(shù)據(jù)庫了。hibernate flush發(fā)生再幾種情況下: 1,調(diào)用某些查詢的時(shí)候 2,transaction commit的時(shí)候 3,手動(dòng)調(diào)用flush的時(shí)候 七,lock和update區(qū)別 update是把一個(gè)已經(jīng)更改過的脫管狀態(tài)的對(duì)象變成持久狀態(tài) lock是把一個(gè)沒有更改過的脫管狀態(tài)的對(duì)象變成持久狀態(tài) 對(duì)應(yīng)更改一個(gè)記錄的內(nèi)容,兩個(gè)的操作不同: update的操作步驟是: ?。?)更改脫管的對(duì)象->調(diào)用update lock的操作步驟是: (2)調(diào)用lock把對(duì)象從脫管狀態(tài)變成持久狀態(tài)——>更改持久狀態(tài)的對(duì)象的內(nèi)容——>等待flush或者手動(dòng)flush |
|