Spring3整合Hibernate3.6之二:用AOP管理事务处理


整合以后可以借助Spring的AOP来管理Hibernate的事务


1.先界定一个事务的边界,这里用的是“ add* ”

2.再把两件事情都放在一个service的操作中,第一件事情执行成功后,第二件事情抛出异常。

3.结果Spring抓取到异常后,把两步操作全都回滚


1.定义事务边界

applicationContext-common.xml中增加以下配置:

其中:expression="execution( * com.rt.sidemo.service.*.*(..)) 定义了此配置具体作用于那个service

其中:<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.RuntionException" /> 定义了事务边界和具体处理策略

<!-- 3.AOP事务管理  事务处理,需要配套的xmlns和schemaLocation -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
	     <property name="dataSource" ref="dataSource"/>  
	</bean> 
	<tx:advice id="transactionManagerAdivice" transaction-manager="transactionManager">  
	   <tx:attributes>  
	      <tx:method name="get*" propagation="REQUIRED" read-only="true" rollback-for="java.lang.RuntionException" />  
	      <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.RuntionException" />  
	   </tx:attributes>  
	</tx:advice>  
	<aop:config>  
	   <aop:pointcut id="allManagerMethod" expression="execution( * com.rt.sidemo.service.*.*(..))"/>  
	   <aop:advisor advice-ref="transactionManagerAdivice" pointcut-ref="allManagerMethod"/>  
	</aop:config> 


2.service里故意抛出异常

整个add方法是一个事务的边界

正常实例插入后,故意出错抛出Runtime异常
此时,连同‘已经’插入的正常实例一起回滚,也就是只要有异常,整部操作回滚

	public void add(Student stu) {//整个add方法是一个事务的边界
		/*
		 * 正常实例插入后,故意出错抛出
		 * 此时,连同‘已经’插入的正常实例一起回滚,也就是只要有异常,整部操作回滚
		 * 证明事务处理时是正确的
		 */
		Student stuNew = new Student();//正常实例,这个可以正常插入没问题
		stuNew.setStudentid(780);
		stuNew.setName("SH_first");
		stuNew.setAge(1);	
		studentDAO.addStudent(stuNew);
		
		throw new RuntimeException();//故意抛出异常,让事务回滚
		
	}


3.执行结果

Hibernate自动打印出建表语句,显示实例已经插入成功

之后Spring抓到异常,又把事务边界内 已经成功执行的项目全都回滚






配置事务处理时遇到个小问题:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'StudentService' defined in file [E:\Java\Workspaces\MyEclipse 10\Spring_Hibernate\bin\com\rt\sidemo\service\StudentService.class]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type


删掉hibernate中的cglib解决的
网上说是hibernate中的cglib和spring的cglib冲突造成的














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值