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