Spring MVC+Hibernate注解事务问题

Spring MVC+Hibernate注解事务问题

以前,经常使用S2SH的框架,没怎么遇到过事务不提交的问题。当下,我们大多数用的都是spring的声明式事务管理。而今,因为项目需求要使用Spring MVC+Hibernate的框架,在搭建此框架的时候,遇到一个很奇怪的问题“可以查询数据,就不能保存或更新数据”。起初我怀疑是我按照Struts2的方式配置引起的,后来查阅资料,基本上排除了,因为不管是Struts2也好,Spring MVC也罢,Spring整合Hibernate的方式都是一样的。接下来,我又怀疑是我代码或Dao写得有问题,后来还是被我排除了,因为我把同样的代码考入到S2SH环境中,就没问题。接下来,我继续查阅资料,谷歌…ok,我终于是找到问题了,也找到解决问题的办法了。当我看到问题原因时,我真是哭笑不得,一个很小的问题,折腾我一天。下面是我对问题的总结:

 

框架采用:spring 3.1 + hibernate 3.6

spring mvc使用注解方式;service使用@service注解 事务使用@Transactional

 

事务配置使用:

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

在插入或更新数据时,无报错,但数据库中无结果,而查询正常。疑为事务未提交。问题分析spring mvc使用注解方式时需要使用Xml代码 

  <context:component-scan base-package="com.liutl.edudemo" >
    <context:include-filter type="regex" expression=".web.*"/>
    <context:include-filter type="regex" expression=".service.*"/>
    <context:include-filter type="regex" expression=".dao.*"/>
 </context:component-scan >

Spring MVC在服务启动时来扫描该包以及其子包下的@Controller注解的类,纳入spring管理,而与此同时spring 容器也使用了这种方式扫描包含@Service、@Components、@Required、@Autowired等注解用来管理bean和完成DI。

Spring MVC在服务启动时来扫描该包以及其子包下的@Controller注解的类时,出现在spring mvc的配置文件中时,web 容器在扫描包含@Service@Components的类并包含@Transaction是,此时@Transaction并为完成,导致事务未被注册。

问题解决

解决1. 将事务注解

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

放入到spring mvc servlet配置文件中,这时候服务启动时,事务也可以同时被加载进去。

参考文献:http://fengzhiyin.iteye.com/blog/714686

猜你喜欢

转载自javaliutl.iteye.com/blog/1420823