0 0

spring mvc+mybatis 事务控制不起作用15

用的是spring mvc和mybatis框架。数据库是mysql。然后发现事务配置了不起作用。。业务逻辑是新增用户,用户新增成功之后再在其他表插入一条对应的用户角色关联信息。现在问题是假如用户插入成功之后。。插入对应的用户角色关联信息出错后,用户那条新增记录不能自动删除。看了很多人说是因为@service提前扫描的问题。那个我改过了。还有说是表的引擎不是InnoDB。但是我们建的表是InnoDB。还有说要抛出RuntimeException。我也抛出了。。但是还是没用。没办法。请大家看下:

-serlet.xml:
<mvc:resources mapping="/resources/**" location="/resources/" />
    
    <context:annotation-config />
    
    <mvc:annotation-driven />
    
    <!-- ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
    <context:component-scan base-package="com.xuanyan.uebuycar.*">
    	<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />  
    </context:component-scan>
	
	<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>   
    <!-- ②:启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    	<property name="cacheSeconds" value="0" />
    	<property name="webBindingInitializer">
    		<bean class="com.xuanyan.uebuycar.admin.util.WebDataBinder4DateAndTime"/>
    	</property>
    </bean>

    <!--  ③:对模型视图名称的解析,即在模型视图名称添加前后缀 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
        p:prefix="/" p:suffix=".html"/>
        
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="i18n/messages"/>   


applicationContext.xml:

<!-- 用于持有ApplicationContext,可以使用SpringContextHolder.getBean('xxxx')的静态方法得到spring bean对象 -->
	<bean class="com.xuanyan.uebuycar.admin.util.SpringContextHolder" lazy-init="false" />
	
	<!-- define the SqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="proxool" />
		<property name="configLocation" value="classpath:mybatis-config.xml" />
	</bean>
	
	<!-- 数据连接事务 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="proxool" />
	</bean>
	
	  
    <!-- 不扫描带有@Controller注解的类。因为这些类已经随容器启动时,在servlet-context中扫描过一遍了 -->
    <context:component-scan base-package="com.xuanyan.uebuycar">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	</context:component-scan>
	
	 <!-- 激活annotation功能 -->
	<context:annotation-config />
	<!-- 激活annotation功能 -->
	<context:spring-configured/>
	
	<!-- mybatis接口 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.xuanyan.uebuycar.admin.dao" />
	</bean>

	<!-- 连接事务的注解配置 -->
    <tx:annotation-driven transaction-manager="transactionManager" /> 
	
	
	
	<aop:config proxy-target-class="true">
		<aop:pointcut id="fooServiceOperation"
			expression="execution(* com.xuanyan.uebuycar.admin.service..*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation" />
	</aop:config>
 
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<!-- the transactional semantics... -->
		<tx:attributes>
			<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception" />  
            <tx:method name="delete*" propagation="REQUIRED"  rollback-for="java.lang.Exception"/>  
            <tx:method name="update*" propagation="REQUIRED"  rollback-for="java.lang.Exception"/>
		</tx:attributes>
	</tx:advice>


方法:
public String addOrUpdate(SysUser record,SysUser currUser,String actionType,String roleId){
		String str=getDefJsonString(false, "操作失败,请稍后再试!");
		try {
			if(record!=null){
				Date now=new Date();
				SysUserExample example=new SysUserExample();
				example.createCriteria().andUserCodeEqualTo(record.getUserCode());
				List<SysUser> list=sysUserMapper.selectByExample(example);
				if("add".equalsIgnoreCase(actionType)){
					if(list!=null&&list.size()>0){
						str=getDefJsonString(false, "操作失败,该账号已存在!");
						return str;
					}
					String userId=CommonUtil.getUUIDString();
					record.setUserId(userId);
					record.setUserPassword(CommonUtil.getMD5Str(SystemCommonParam.DEFAULT_USER_PWD));
					record.setUpdateUser(currUser.getUserCode());
					record.setUpdateTime(now);
					if(sysUserMapper.insertSelective(record)>0){
						SysRoleUser ru=new SysRoleUser();
//						ru.setRoleUserId(CommonUtil.getUUIDString());
						ru.setRoleId(roleId);
						ru.setUserId(userId);
						ru.setUpdateUser(currUser.getUserCode());
						ru.setUpdateTime(now);
						if(sysRoleUserMapper.insertSelective(ru)>0){
							str=getDefJsonString(true, "新增成功!");
						}
					}
				}else if("edit".equalsIgnoreCase(actionType)){
					if(list!=null&&list.size()>0){
						if(!list.get(0).getUserId().equals(record.getUserId())){
							str=getDefJsonString(false, "操作失败,该账号已存在!");
							return str;
						}
					}
					
					record.setUpdateUser(currUser.getUserCode());
					record.setUpdateTime(now);
					if(sysUserMapper.updateByPrimaryKeySelective(record)>0){
						SysRoleUser ru=new SysRoleUser();
						ru.setRoleId(roleId);
						
						SysRoleUserExample ex=new SysRoleUserExample();
						ex.createCriteria().andUserIdEqualTo(record.getUserId());
						if(sysRoleUserMapper.updateByExampleSelective(ru, ex)>0){
							str=getDefJsonString(true, "修改成功!");
						}
					}
				}
			}
		} catch (Exception e) {
			str=getDefErrorString();
			e.printStackTrace();
			throw new RuntimeException();
		}
		return str;
	}


类路径:com.xuanyan.uebuycar.admin.services.sys.SysUserService

希望各位有知道能够告知一下。。是不是我service方法写的不对?
2013年4月06日 18:41

2个答案 按时间排序 按投票排序

0 0

采纳的答案

<aop:pointcut id="fooServiceOperation" 
            expression="execution(* com.xuanyan.uebuycar.admin.service..*.*(..))" /> 


com.xuanyan.uebuycar.admin.services.sys.SysUserService

1、先在控制器中通过AopUtils.isAopProxy 看看你注入的是不是代理对象 再来分析

2013年4月06日 21:37
0 0

1、mysql存储引擎要为innodb
2、方法不用try catch,或者catch的异常为RunException或者DataAccessException,因为为exception的时候,异常没法捕获
满足以上两点,相信你的问题就解决了!!!

2013年4月06日 23:33

相关推荐

    spring+spring mvc+mybatis框架整合实现超市货物管理系统

    在本文中,我们将深入探讨如何使用JavaEE技术栈,特别是Spring、Spring MVC和MyBatis框架,来构建一个超市货物管理系统的实现。这个系统涵盖了基本的登录功能以及与MySQL数据库的交互,包括增删改查操作和分页显示。...

    Java EE 框架整合开发⼊⻔到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf

    这份文档名为《Java EE 框架整合开发入门到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf》,它显然是关于Java EE中流行的三个框架整合使用的教程。这三个框架分别是Spring、Spring MVC和MyBatis,...

    基于maven+spring+spring mvc+mybatis 框架web项目

    在IT行业中,构建Web应用程序是一项常见的任务,而“基于maven+spring+spring mvc+mybatis框架web项目”提供了一个适用于初学者的学习路径。这个项目利用了四个关键的技术组件,它们分别是Maven、Spring、Spring MVC...

    基于Spring + Spring MVC + MyBatis的图书馆管理系统

    《构建基于Spring + Spring MVC + MyBatis的图书馆管理系统》 图书馆管理系统是信息化时代图书馆管理的重要工具,它能够高效地实现图书的查询、管理、编辑,以及读者的管理和服务。本系统采用Java语言,结合Spring...

    Spring MVC + Mybatis+Spring实现的个人博客系统

    在本项目中,Spring作为容器管理了所有bean的生命周期,包括Spring MVC的控制器、Mybatis的SqlSessionFactory等,同时提供了事务管理功能。 **4. 数据库设计** 博客系统的数据库通常会包含用户表、博客文章表、评论...

    《Java EE企业级应用开发教程Spring+Spring MVC+MyBatis》_源代码.zip

    《Java EE企业级应用开发教程Spring+Spring MVC+MyBatis》是一本深入探讨Java企业级应用程序开发的书籍,源代码包含多个章节的实例,旨在帮助读者理解和掌握使用Spring、Spring MVC和MyBatis框架进行实际开发的关键...

    Spring MVC+ Spring+ Mybatis 框架搭建

    Spring MVC、Spring和Mybatis是Java开发中非常流行的三大开源框架,它们的组合,通常被称为“SSM”框架。SSM框架的使用可以极大地提高Web应用的开发效率,通过合理的解耦,使得各组件能够更好地协同工作。接下来,...

    Java EE企业级应用开发教程 Spring+Spring MVC+MyBatis 第2版 Jav 第2版源码

    《Java EE企业级应用开发教程》第二版,结合Spring、Spring MVC和MyBatis三大框架,为读者提供了全面深入的Java后端开发学习路径。这本书的源码资源旨在帮助开发者通过实践来理解并掌握企业级应用开发的核心技术。 ...

    activiti+spring+srping Mvc+mybatis+maven整合

    本项目是关于"activiti+spring+spring Mvc+mybatis+maven"的整合,旨在创建一个基于Activiti工作流引擎、Spring、Spring MVC、MyBatis以及Maven的开发环境。下面将详细介绍这些技术及其整合过程。 首先,`activiti`...

    maven+spring MVC+Mybatis+jetty+mysql

    "maven+spring MVC+Mybatis+jetty+mysql" 的组合是常见的开发栈,它涵盖了项目管理、前端控制器、持久层操作、应用服务器以及数据库管理等多个层面。下面将详细介绍这些关键技术及其在实际应用中的作用。 1. Maven...

    《Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)》配套资源.zip

    《Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)》是一份全面深入讲解Java企业级应用开发的教程,重点聚焦于Spring、Spring MVC和MyBatis这三个核心框架。这些技术在现代Java开发中占据着举足轻重的地位...

    Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-源代码

    Java EE企业级应用开发是构建大型、复杂系统的关键技术,其中Spring、Spring MVC和MyBatis是核心组件,常被组合使用,形成了SSM(Spring + Spring MVC + MyBatis)框架栈。这个教程源代码提供了深入理解这些技术的...

    Spring+spring MVC+MyBatis示例

    2. **AOP(面向切面编程)**:Spring的AOP模块允许我们在不修改业务代码的情况下,实现如日志记录、事务管理等功能。 3. **Spring MVC**:Spring MVC是Spring框架的一部分,用于构建Web应用的模型-视图-控制器架构。...

    spring+springmvc+mybatis

    在Java企业级应用开发领域,Spring、SpringMVC和MyBatis是三个不可或缺的重要组件,它们共同构建了一个强大的、灵活的和可扩展的应用框架。这篇文章将深入探讨这三个框架的核心概念、工作原理以及如何将它们整合在...

    Spring Cloud+Spring MVC+Mybatis项目源码.rar_mvc_spring mvc项目_spring-

    标题中的“Spring Cloud+Spring MVC+Mybatis项目源码”表明这是一个综合了Spring框架生态的实战项目,结合了微服务架构、Web应用开发以及持久层处理的全方位技术栈。Spring MVC是Spring框架的一部分,用于构建Web...

    Spring+MVC+MYBatis企业应用实战

    《Spring+MVC+MYBatis企业应用实战》是一本深度探讨Java开发中三大核心框架集成应用的指南。Spring作为一款全面的企业级应用框架,提供了依赖注入、AOP(面向切面编程)以及众多模块,如Spring MVC和Spring JDBC,为...

    Spring + Spring MVC+ Mybatis

    在Java Web开发领域,Spring、Spring MVC和Mybatis是三个非常重要的组件,它们组合在一起形成了一个强大的后端开发框架,被广泛应用于各种项目中。这个压缩包文件"SSM_ces"很可能是包含了使用这三个框架整合的示例...

    spring + spring mvc + mybatis SSM整合版+Mysql数据库

    SSM框架是Java Web开发中常用的三大组件Spring、Spring MVC和Mybatis的组合,它们各自在Web应用中承担着不同的职责。Spring作为一个全面的轻量级应用框架,提供了依赖注入(DI)和面向切面编程(AOP)等功能,极大地...

    Spring+Spring MVC+MyBatis之零配置之路源代码

    在IT行业中,Spring、Spring MVC和MyBatis是三大非常重要的Java Web开发框架,它们各自在应用程序的不同层次上发挥着关键作用。这个"Spring+Spring MVC+MyBatis之零配置之路源代码"项目旨在展示如何在不使用XML配置...

    Spring+SpringMVC+MyBatis整合工程实例 完整版源码(带注释)

    这三个框架各有其优势,Spring负责控制层,SpringMVC处理视图和业务逻辑,而MyBatis则专注于数据库操作。 **1. Spring框架** Spring是Java领域的一个全面的轻量级应用框架,提供依赖注入(DI)和面向切面编程(AOP...

Global site tag (gtag.js) - Google Analytics