關於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事務管理

  1. 需要使用getCurrentSession獲取session
  2. 在操作中不要顯示的關閉session
  3. 不需要進行編碼式事務,使用聲明式事務

在spring配置文件中添加如下代碼

此時的dao層只需要簡單的 session().update(entity)就行了

使用Spring事務註解管理

確定了事務問題,但是事務配置有沒有錯誤。

錯誤原因:是配置出現了問題:

web.xml

問題是:spring-mvc.xml由servlet加載的時候

如果一開始就註冊所有的註解,那麼,遇到@service的時候,事務配置就很可能無效,尤其是@Transactional一定失效。所以事務配置就不管用

解決方案:分開加載控制器和其他註解。控制器的註解由springmvc.xml加載

spring配置文件中,加載其他註解:

這樣就配置好了運行起來控制台也打印hql語句了