Hibernate Session的Flush模式
2019獨角獸企業重金招聘Python工程師標準>>>
首先要知道的是:
Hibernate會盡量將與數據庫的操作延遲,直到必須要與數據庫進行交互,例如save方法一般會在提交時才真正執行,最終在提交時會以批處理的方式與數據庫進行交互,以提高效率。
而將操作延遲,就是利用緩存,將最后要處理的操作放到緩存中。
flush方法的主要作用就是清理緩存,強制數據庫與Hibernate緩存同步,以保證數據的一致性。它的主要動作就是向數據庫發送一系列的sql語句,并執行這些sql語句,但是不會向數據庫提交。而commit方法則會首先調用flush方法,然后提交事務。
?????
????? 在下面的情況下,Hibernate會調用Session.flush()以清理緩存:
???? 1)事務提交時,如果flush模式不為FlushMode.NEVER,commit()將調用flush().
???? 2)在某些查詢語句之前(此查詢語句之前的語句已經改變了數據庫狀態,所以需要調用flush()以同步數據庫是查出來的數據是經過更改的)。
????
???? 除非明確地指定了flush()命令,否則關于Session何時會執行這些JDBC調用完全是無法保證的,只能保證他們執行的前后順序。
?
??通過設置session.setFlushMode(),可以精確控制Hibernate的FlushMode.
??(1)? FlushMode.AUTO:Hibernate判斷對象屬性有沒有改變,如果被更改成為臟數據,則在一個查詢語句前將更新此改動以保證數據庫的同步。這也是Hibernate的默認清理模式。
??(2)?FlushMode.COMMIT:在事務結束之前清理session的緩存。這樣有可能導致查出臟數據
??(3)?FlushMode.NEVER:除非強制調用Session.flush(),否則永遠不清理Session。相當于將數據庫設置為一個只讀的數據庫。
???????【如果此時進行數據的寫入操作,會發生錯誤】
??(4)?FlushMode.ALWAYS:在每一個查詢數據之前都調用Session.flush()。很顯然這種效率很低。
??
?在調用Session.flush()時,涉及的SQL語句會按照下面的順序執行。
(1)???????? 所有的實體進行插入的語句,其順序按照對象執行Session.save()的時間順序。
(2)???????? 所有對實體進行更新的語句
(3)???????? 所有對集合元素進行刪除,更新或者插入的語句
(4)???????? 所有對實體經行刪除的語句,其順序按照對象執行Session.delete()的時間順序。
(5)???????? 有一個例外是,如果對象使用native方式生成的ID(持久化標識),則他們一執行save就會被插入。
???????????????? 【因為native方式若想得到主鍵,必須與數據庫交互,而hilo方式則不用】)
轉載于:https://my.oschina.net/pangzhuzhu/blog/318160
總結
以上是生活随笔為你收集整理的Hibernate Session的Flush模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVC 表单验证
- 下一篇: Activity和ListActivit