集成背景: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 一块儿讨论。