在沒有使用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配置文件中添加以下代碼測試
此時的dao層只須要簡單的 session().update(entity)
就好了編碼
肯定了事務問題,可是事務配置有沒有錯誤。spa
錯誤緣由:是配置出現了問題:hibernate
web.xml
問題是:spring-mvc.xml由servlet加載的時候
若是一開始就註冊全部的註解,那麼,遇到@service的時候,事務配置就極可能無效,尤爲是@Transactional必定失效。因此事務配置就無論用
解決方案:分開加載控制器和其餘註解。控制器的註解由springmvc.xml加載
spring配置文件中,加載其餘註解:
這樣就配置好了運行起來控制檯也打印hql語句了