对Flush原理的个人理解
PS:聽了尚學(xué)堂老師的課自己總結(jié)的,有錯誤的地方歡迎大家指正。
1.??????看一下session的結(jié)構(gòu)。
l? Session中有一個actionQueue隊列,其中有幾個對象比如Insertions,deletetions等等。當(dāng)執(zhí)行完save(),delete()等操作之后,就把想要執(zhí)行sql對象放在相應(yīng)的對象中。
l? Session中還有一個persistenceContext,相當(dāng)于緩存。在這之中有一個entityEntries,經(jīng)過幾層目錄之后,發(fā)現(xiàn)還有一份sql執(zhí)行對象,也就是說當(dāng)session.save()等操作之后,實際上把要執(zhí)行sql的對象放在了兩個地方。其中有個不同,在entityEntries中的,有個標(biāo)識exsistsInDatebase,查看數(shù)據(jù)庫中有無記錄。
2.??????Flush工作原理:
l? 當(dāng)執(zhí)行flush之后,首先到actionQueue中,將要發(fā)出的sql語句發(fā)出,然后將actionQueue中與之對應(yīng)的映射清空。然后到persistenceContext中,將exsistsInDatebase設(shè)置為true。要想把緩存清空需要調(diào)用evict()方法或者clear()方法。
l? 補充:如果先save(),再evict(),最后commit(),會出現(xiàn)問題。因為evict(),把緩存清空了,但是當(dāng)執(zhí)行commit()的時候會顯示的調(diào)用flush方法,發(fā)現(xiàn)在映射中存在,需要發(fā)出sql語句,但是需要在persistenceContext中找到與之對應(yīng)的對象,并將exsistsInDatebase設(shè)置為true的時候發(fā)現(xiàn)對象沒了,所以會報錯。所以save()之后flush()一下就沒問題了。
3.??????關(guān)于Hibernate主鍵生成策略。
l? 主鍵生成策略采用的是uuid,調(diào)用完成save后,只是將user納入到了session的管理不會發(fā)出insert語句,但是id已經(jīng)生成,session中existsInDatebase狀態(tài)為false。
l? 主鍵生成策略采用的是asign,同上不會發(fā)出insert語句。
l? 主鍵生成策略為native,調(diào)用session.save后,將執(zhí)行insert語句,返回有數(shù)據(jù)庫生成的id,納入了session的管理,修改了session中existsInDatebase狀態(tài)為true。如果數(shù)據(jù)庫的隔離級別設(shè)置為為提交讀,那么我們可以看到save過的數(shù)據(jù)。
轉(zhuǎn)載于:https://www.cnblogs.com/hainange/archive/2012/04/13/6153650.html
總結(jié)
以上是生活随笔為你收集整理的对Flush原理的个人理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinSocket简单编程实验
- 下一篇: ZJU PAT 1027 Colors