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