Could not obtain transaction-synchronized Session for current thread

用Junit做单元测试时,报了这个错:Could not obtain transaction-synchronized Session for current thread

原因是没有为组件加入事务控制

解决的方法有两种

1.使用注解的方式

在spring-context.xml文件中加入<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />,

然后在@service组件或者@Repository组件中加入@Transactional注解,spring就会自动为@Transactional注解的类定义事务

2.利用spring的aop面向切面的功能实现事务的传播

在spring-context.xml文件中加入如下配置:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="save*" propagation="REQUIRED"/>
			<tx:method name="set*" propagation="REQUIRED"/>
			<tx:method name="del*" propagation="REQUIRED"/>
			<tx:method name="update*" propagation="REQUIRED"/>
			
			<tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>			
			<tx:method name="find*" read-only="true" propagation="NOT_SUPPORTED"/>
			<tx:method name="query*" read-only="true" propagation="NOT_SUPPORTED"/>			
			<tx:method name="select*" read-only="true" propagation="NOT_SUPPORTED"/>				
					
			<tx:method name="*" rollback-for="Exception"/>
		</tx:attributes>
	</tx:advice>	
	<aop:config proxy-target-class="true">
		<aop:pointcut id="txNeed" expression="<span style="color:#FF0000;">execution(* com.watson.web.service..*.*(..))</span>"/>
        <aop:advisor pointcut-ref="txNeed" advice-ref="txAdvice"/>
	</aop:config>

红色部分为定义通知织入的横切面,也就是横切点,会扫描service包下面的(包括子包)所有类的所有方法,为扫描到的方法织入事务。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值