對Flush原理的個人理解

PS:聽了尚學堂老師的課自己總結的,有錯誤的地方歡迎大家指正。

1.      看一下session的結構。

l  Session中有一個actionQueue隊列,其中有幾個對象比如Insertions,deletetions等等。當執行完save(),delete()等操作之後,就把想要執行sql對象放在相應的對象中。

l  Session中還有一個persistenceContext,相當於緩存。在這之中有一個entityEntries,經過幾層目錄之後,發現還有一份sql執行對象,也就是說當session.save()等操作之後,實際上把要執行sql的對象放在了兩個地方。其中有個不同,在entityEntries中的,有個標識exsistsInDatebase,查看數據庫中有無記錄。

2.      Flush工作原理:

l  當執行flush之後,首先到actionQueue中,將要發出的sql語句發出,然後將actionQueue中與之對應的映射清空。然後到persistenceContext中,將exsistsInDatebase設置爲true。要想把緩存清空需要調用evict()方法或者clear()方法。

l  補充:如果先save(),再evict(),最後commit(),會出現問題。因爲evict(),把緩存清空了,但是當執行commit()的時候會顯示的調用flush方法,發現在映射中存在,需要發出sql語句,但是需要在persistenceContext中找到與之對應的對象,並將exsistsInDatebase設置爲true的時候發現對象沒了,所以會報錯。所以save()之後flush()一下就沒問題了。

3.      關於Hibernate主鍵生成策略。

l  主鍵生成策略採用的是uuid,調用完成save後,只是將user納入到了session的管理不會發出insert語句,但是id已經生成,session中existsInDatebase狀態爲false。

l  主鍵生成策略採用的是asign,同上不會發出insert語句。

l  主鍵生成策略爲native,調用session.save後,將執行insert語句,返回有數據庫生成的id,納入了session的管理,修改了session中existsInDatebase狀態爲true。如果數據庫的隔離級別設置爲爲提交讀,那麼我們可以看到save過的數據。


發佈了64 篇原創文章 · 獲贊 5 · 訪問量 63萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章