如圖:
故事背景:(p.s.我們的項目沒有正確配置事務xml文件,未明原因導致事務定義的規則不起作用)獲取一個資訊對象,調用該對象的set方法設置其中的content字段,然后把修改后的實體丟到官網首頁進行展示。結果部署到生產后發現,在進入首頁獲取資訊列表時,在調用到如圖的方法時,會直接將臨時set的content持久化到到數據庫中了。好吧,這明顯是有問題的....那么,是什么原因呢?
答:
a.查看日志信息后發現,系統總是會打印出一個update語句。說明系統的確是執行了更新操作的,但是我並沒有調用任何和update相關的方法。
b.跟蹤代碼發現,queryByCondition方法其實是調用了hibernate的get方法。嗯,果然,問題出在這里了.....
c.Hibernate的get和load方法查詢出的實體都是持久化對象,拿到該對象后,如果你調用了該對象的set方法,那么在事務遞交的時候,Hibernate會把你設置的值自動更新到數據庫中。
如何解決:
方案1:在獲取實體對象后,調用下getHibernateTemplate().evict(entity)方法,該方法的作用是把持久化對象變成托管狀態。變成托管狀態后,Hibernate就不會再去自動更新該實體。
方案2:正確配置事務。參考:https://blog.csdn.net/qq_19167629/article/details/80426625
參考:https://www.cnblogs.com/xiao-lei/p/10005625.html