用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包下面的(包括子包)所有类的所有方法,为扫描到的方法织入事务。