關於spring整合hibernate使用update無異常但沒有效果(不輸出sql語句)
- 2019 年 10 月 8 日
- 筆記
單獨使用hibernate時
openSession()
在沒有使用spring控制事務時,使用的是sessionFactory.openSession()。這樣每個方法都會新建一個session,必須在方法中控制和關閉session。
於是一開始我直接在try-with-resource語句中使用session的update等方法,無任何事務,在單元測試時發現update方法無效。
解決方法有兩種:
- 加上事務控制:
session.beginTransaction()和trans.commit()
- 加上flush方法:
session.flush()
session原理:其實我們執行session更新和刪除操作的時候,不會立即執行,要執行flush才可執行。但是如果配置了事務管理,這件事就可以交給事務管理器去完成,在事務提交的時候執行自動執行flush語句
使用Spring事務管理
- 需要使用getCurrentSession獲取session
- 在操作中不要顯示的關閉session
- 不需要進行編碼式事務,使用聲明式事務
在spring配置文件中添加如下代碼
此時的dao層只需要簡單的 session().update(entity)
就行了
使用Spring事務註解管理
確定了事務問題,但是事務配置有沒有錯誤。
錯誤原因:是配置出現了問題:
web.xml
問題是:spring-mvc.xml由servlet加載的時候
如果一開始就註冊所有的註解,那麼,遇到@service的時候,事務配置就很可能無效,尤其是@Transactional一定失效。所以事務配置就不管用
解決方案:分開加載控制器和其他註解。控制器的註解由springmvc.xml加載
spring配置文件中,加載其他註解:
這樣就配置好了運行起來控制台也打印hql語句了