问题描述
经过进一步了解得知@Transactional注解需要<tx:annotation-driven transaction-manager="jpaTxManager" />配置但是前提是只对已经注入的bean起作用,(配置在xml中的bean)但是对@Controller这样未经xml配置的bean却不起作用,如何解决这个问题呢原问题:我使用JPA集成spring的配置<bean id="jpaTxManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory" /><property name="dataSource" ref="dataSource" /></bean><tx:annotation-driven transaction-manager="jpaTxManager" />然后只有在每个daoImpl前加@Transactional 增删改才可以生效如果不加@Transactional 则调用增删改方法不会生效@Transactionalclass UserDaoImpl{ public void save(){ xxxx }}class RoleDaoImpl{ public void save(){ xxxx }}问题:我在另一个类中调用Dao如:class UserController{ UserDao userDao; RoleDao roleDao; @Transactional public void saveUserRole(){ userDao.save(xxx); roleDao.save(yyy); }}但是controller中两个save方法仍然是分别得事务,比如userDao插入失败,但是roleDao却插入成功如何让userDao 与 roleDao 同时成功,同时回滚@Transactional 这个具体用法我搜过相关配置资料了,一一试过都不大管用, 不知道这个的事务处理机制是怎样的。。。
解决方案
问题1:引用对@Controller这样未经xml配置的bean却不起作用,如何解决这个问题呢在spring配置文件里加上<context:component-scan annotation-config="false" base-package="com.icom.ud.controller" resource-pattern="*.class"><!-- 这样可以减少扫描处理量 --><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan>问题2:引用只有在每个daoImpl前加@Transactional 增删改才可以生效 如果不加@Transactional 则调用增删改方法不会生效因为加上Transactional ,操作事务才会commit(由spring事务管理器执行),否则是不会commit的,除非你显示的commit。问题3:引用但是controller中两个save方法仍然是分别得事务,比如userDao插入失败,但是roleDao却插入成功 如何让userDao 与 roleDao 同时成功,同时回滚 我觉得应该是userDao插入失败时,抛的不是runtimeException子类型异常(spring事务管理器默认,在发现runtimeException及其子类型异常时,事务会回滚),因此不妨尝试如下设置:引用@Transactional(rollbackFor=Exception.class) public void saveUserRole(){ userDao.save(xxx); roleDao.save(yyy); }