關於spring整合hibernate使用update無異常但沒有效果(不輸出sql語句)

單獨使用hibernate時

openSession()

在沒有使用spring控制事務時,使用的是sessionFactory.openSession()。這樣每一個方法都會新建一個session,必須在方法中控制和關閉session。web

因而一開始我直接在try-with-resource語句中使用session的update等方法,無任何事務,在單元測試時發現update方法無效。spring

解決方法有兩種:spring-mvc

  • 加上事務控制: session.beginTransaction()和trans.commit()session

  • 加上flush方法: session.flush()mvc

session原理:其實咱們執行session更新和刪除操做的時候,不會當即執行,要執行flush纔可執行。可是若是配置了事務管理,這件事就能夠交給事務管理器去完成,在事務提交的時候執行自動執行flush語句單元測試

使用Spring事務管理

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

 在spring配置文件中添加以下代碼測試

此時的dao層只須要簡單的 session().update(entity)就好了編碼

使用Spring事務註解管理

肯定了事務問題,可是事務配置有沒有錯誤。spa

 錯誤緣由:是配置出現了問題:hibernate

web.xml

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

若是一開始就註冊全部的註解,那麼,遇到@service的時候,事務配置就極可能無效,尤爲是@Transactional必定失效。因此事務配置就無論用

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

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

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

相關文章
相關標籤/搜索