Spring中配置Hibernate事务管理

 

<!-- transationManager -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- advice  -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="insert*" propagation="REQUIRED"/>
      <tx:method name="delete*" propagation="REQUIRED"/>
      <tx:method name="update*" propagation="REQUIRED"/>
      <tx:method name="select*" propagation="SUPPORTS"  read-only="true"/>
      <tx:method name="*" rollback-for="java.lang.Exception" timeout="100" />
    </tx:attributes>
</tx:advice>
<aop:config proxy-target-class="true">
    <aop:pointcut id="interceptorPointCuts" expression="execution(public * com.bai.du.*.service.impl.*.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />
</aop:config>            

  这里统一规定了service实现类中与事务有关的方法的命名规则,比如新增方法,方法名必须以insert开头;删除方法,方法名必须以delete开头;更新方法,方法名必须以update开头,查询方法必须以select开头,以什么开头或结尾这可以自定义,只有这样方法才能被spring的事务管理,为什么要在service层配置事务呢?这是因为service中定义的是业务操作(比如存取款),而这个业务操作可能需要多次操作数据库,为防止操作数据库过程中可能会出现部分成功,部分失败的情况,所以把事务放在service层,这样只有数据库操作全部成功(不报异常),整个事务才会提交。

  上面是采用xml配置事务,这样的好处是仅此一处配置,便可实现所有匹配的事务,事务配置与代码高度分离,缺点是需要遵循定义的命名规则,还有一种方法就是使用注解,只需要在xml文件中增加:

<tx:annotation-driven transaction-manager="transactionManager"/>

并且在需要事务管理的方法上添加@Transactional()注解(注意是spring包的),()中同样可以定义propagation,read-only,rollback-for等属性。注解的优势是配置比较灵活,xml文件中配置比较简洁,缺点是需要的地方就必须添加注解,比较繁琐,而且还增加代码的耦合。建议使用xml配置方式。

posted @ 2015-09-12 20:02  lavel  阅读(3780)  评论(2编辑  收藏  举报