集成背景:java
基於當前使用的項目是spring3和hibernate3 因此打算升級一下Spring版本和Hibernate的版本。git
集成中遇到的問題。集成中遇到了這位博客友人遇到的一切問題,苦苦尋找問題了2天終於找到解決了。web
問題1:spring
Hibernate4 中推薦使用 Session session = sessionFactory.getCurrentSession();來獲取Session進而進行數據的增刪改查。express
Could not obtain transaction-synchronized Session for current thread;
針對這個問題,我在網上發行也出現了好多個,有經過在類或者方法上添加 @Transactional解決的,我嘗試了不行;後來我嘗試下面的方法,在web.xml添加以下配置spring-mvc
<filter> <filter-name>SpringOpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>SpringOpenSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
可是這樣配置 貌似能夠正常獲取到Session 可是事務沒有開啓,對應 update和delete之類的方法不提交事務。後來我又接着查找問題,在項目上反覆進行事務開啓的測試 無論是使註解仍是聲明式 都沒法開啓事務(這裏主要是在運行中的項目測試 致使 採用聲明式事務的時候 沒有把 註解的給去掉 以致於走了彎路,還覺得聲明式也不行)session
後來 我下載了一個網上集成的好的例證,我運行了一下;發現能夠正常獲取session 而且不須要SpringOpenSessionInViewFilter的配置。mvc
而後我就仔細研究了一下配置,發現他採用的是xml方式定義的bean 而且能夠正常 開啓事務,我就逐步改成註解方式注入bean。當我採用註解的時候 發現不行,事務開啓不了;後來我就繼續看配置文件。終於找到問題緣由:在兩個xml配置文件中 視圖的配置文件(spring-mvc.xml)和 hibernate的配置文件(spring-hibernate.xml)都進行包的全局掃描 而沒有進行過濾,原本視圖的配置文件應該僅僅掃描註解爲@Controll的類,致使事務開啓不了;而後把兩個配置進行過濾掃描便可 也能夠正常開啓事務並回滾事務。app
視圖配置文件的Controll的過濾框架
<context:component-scan base-package="com.lei.demo" use-default-filters="false" > <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/> </context:component-scan>
數據源-各類Bean及事務配置的過濾
<context:component-scan base-package="com.lei.demo"> <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/> </context:component-scan>
至此 通過兩天的解決問題並集合成功 終於能夠正常獲取session和開啓事務了。
心得:當遇到項目要進行框架升級時,建議先用一個demo來進行框架配置,等配置基本和項目的框架配置同樣了,再進行項目框架的升級,否則會有N個坑等着你。以前對事務研究的少 經過此次集成 又一次深刻研究了spring框架和註解事務的注意事項。
其餘的嘗試解決方法:
在hibernateProperties中增長
hibernate.current_session_context_class = org.springframework.orm.hibernate4.SpringSessionContext
後來我發現徹底多餘 由於對於Hibernate4 的sessionFactory 默認就是這個。
框架的Demo 源代碼下載地址:git項目下載
若有問題能夠加羣 號:367523618 一塊兒討論。