簡(jiǎn)單講解Hibernate flush
在向大家詳細(xì)介紹Hibernate flush之前,首先讓大家了解下saveOrUpdateCopy,merge和update區(qū)別,然后全面介紹Hibernate flush。
saveOrUpdateCopy,merge和update區(qū)別
首先說明merge是用來代替saveOrUpdateCopy的,然后比較update和merge,update的作用上邊說了,這里說一下merge的,如果session中存在相同持久化標(biāo)識(shí)(identifier)的實(shí)例,用用戶給出的對(duì)象的狀態(tài)覆蓋舊有的持久實(shí)例,如果session沒有相應(yīng)的持久實(shí)例,則嘗試從數(shù)據(jù)庫(kù)中加載,或創(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ù)庫(kù)了。Hibernate flush發(fā)生再幾種情況下:
1,調(diào)用某些查詢的時(shí)候
2,transaction commit的時(shí)候
3,手動(dòng)調(diào)用flush的時(shí)候
lock和update區(qū)別
1.update是把一個(gè)已經(jīng)更改過的脫管狀態(tài)的對(duì)象變成持久狀態(tài)
2.lock是把一個(gè)沒有更改過的脫管狀態(tài)的對(duì)象變成持久狀態(tài)
對(duì)應(yīng)更改一個(gè)記錄的內(nèi)容,兩個(gè)的操作不同:
1.update的操作步驟是:更改脫管的對(duì)象->調(diào)用update
2.lock的操作步驟是:調(diào)用lock把對(duì)象從脫管狀態(tài)變成持久狀態(tài)——>更改持久狀態(tài)的對(duì)象的內(nèi)容——>等待flush或者手動(dòng)flush
【編輯推薦】