日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对Flush原理的个人理解

發布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对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過的數據。


轉載于:https://www.cnblogs.com/hainange/archive/2012/04/13/6153650.html

總結

以上是生活随笔為你收集整理的对Flush原理的个人理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。