@controller @Autowired 对@Transactional 不起作用

问题描述

经过进一步了解得知@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); }

时间: 2024-08-01 05:06:40

@controller @Autowired 对@Transactional 不起作用的相关文章

关于spring aop的cglib代理什么时候才起作用

问题描述 网上的文章都说 <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>配置了这句话的话就会强制使用cglib代理,如果proxy-target-class改成"false"的话就会先使用jdk动态代理如果不是接口来实现的话再使用cglib代理,但是我实验的时候如果proxy-target-class改成false的话永远是使用jdk动态代理啊

Asp.Net MVC3 简单入门第一季(三)详解Controller之Filter

前言 前面两篇写的比较简单,刚开始写这个系列的时候我面向的对象是刚开始接触Asp.Net MVC的朋友,所以写的尽量简单.所以写的没多少技术含量.把这些技术总结出来,然后一简单的方式让更多的人很好的接受这是我一直努力的方向.后面会有稍微复杂点的项目!让我们一起期待吧! 此文我将跟大家介绍一下Asp.Net MVC3 Filter的一些用法.你会了解和学习到全局Fileter,Action Filter等常用用法. 第一节:Filter知识储备 项目大一点总会有相关的AOP面向切面的组件,而MVC

SSH(spring+springmvc+hibernate)框架快速上手

目录框架 目录框架如图所示.java代码包名即所存放代码的分类. - controller->处理请求 - dao->数据访问层接口 - dao.impl->数据访问层接口实现(实现数据库操作) - entity->实体类(数据库中的表) - service->业务层接口 - service.impl->业务层接口实现(主要代码编写区域) - util->工具集 配置文件 - hibernate.properties->hibernate相关配置(数据库驱动

Spring 3.0 注解注入详解

原文地址: http://developer.51cto.com/art/201104/255395.htm 一.各种注解方式 1.@Autowired注解(不推荐使用,建议使用@Resource) @Autowired可以对成员变量.方法和构造函数进行标注,来完成自动装配的工作.@Autowired的标注位置不同,它们都会在Spring在初始化这个bean时,自动装配这个属性.要使@Autowired能够工作,还需要在配置文件中加入以下 Xml代码 <bean class="org.sp

SpringMVC4+Hibernate4学习笔记

(一)配置详解 (注:本文是以前几篇博客的简单合并,未做更新) 鉴于目前资料大多数都是基于spring3的配置,本人在最初搭建的时候遇到很多问题,由此记录下来仅供参考 使用的jar文件 springframework4.0.6(为了方便整个先导入) hibernate4.3.6 /required/*下所有jar 以及 /optional下的c3p0(为了使用c3p0作为dataSource,使用其连接池) jstl.jar standard.jar --为了使用jstl标签库 apoallia

有关Spring注解@xxx的零碎知识

 在Java的Spring开发中经常使用一些注解,例如 @XXX 等等,在网上看到收集整理碎片知识,便于懒人计划^=^... 过去,Spring使用的Java Bean对象必须在配置文件[一般为application.xml] 中进行配置,然后才能使用,但Spring2.5版之后,引入了配置注解功能,操作更简单,但是不了解的就抽象了,所以有必要了解一下一些注解的知识: 一,首选注意,注解,注入需要的JAR包,即用common-annotations.jar 包的支持: 二,要使用注解,注入功

Spring中的注解

  一.@Autowired注解(推荐使用@Resource) @Autowired可以对成员变量.方法和构造函数进行标注,来完成自动装配的工作.@Autowired的标注位置不同,它们都会在Spring在初始化这个bean时,自动装配这个属性.要使@Autowired能够工作,还需要在配置文件中加入 <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor&

Spring的声明式事务管理

在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚.这个例外是unchecked 如果遇到checked意外就不回滚. 如何改变默认规则: 1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class) 2 让unchecked例外不回滚: @Trans

springmvc+mybatis整合

问题描述 springmvc+mybatis整合 spring-servlet.xml <beans:bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"> <beans:property name="driverClassName" value="org.postgresql.Driver"/> <beans