春季休眠,如何在事务提交或事务回滚后调用一些方法

2022-09-03 08:24:02

我需要在事务成功或回滚后调用一些方法。我正在使用

    <bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
                <property name="sessionFactory">
                    <ref local="mysessionFactory"/>
                </property>
    </bean>

    <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref local="mysessionFactory"/>
        </property>
    </bean>

<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>

应用程序使用一些外部 Web 服务,当内部事务回滚时,需要“清理”这些服务。有没有办法在不使用声明性事务管理的情况下实现这一点。


答案 1
  • 从 Hibernate 中,您可以扩展和重写方法,并在 或 中注册它。EmptyInterceptorafterTransactionCompletion()SessionFactoryBeanHibernateTransactionManager

  • 从 Spring 开始,您可以扩展、覆盖并在适当的时候使用 .TransactionSynchronizationAdapterafterCompletion()TransactionSynchronizationManager#registerSynchronization()

编辑

使用 Spring Aop 向所有带有注释的方法添加同步的示例@Transactional

@Aspect
class TransactionAspect extends TransactionSynchronizationAdapter {

    @Before("@annotation(org.springframework.transaction.annotation.Transactional)")
    public void registerTransactionSyncrhonization() {
        TransactionSynchronizationManager.registerSynchronization(this);

    }

    @Override
    public void afterCompletion(int status) {
        // code 
    }
}

答案 2

Spring有各种课程,在这里可能会引起人们的兴趣:

http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/transaction/support/TransactionSynchronization.html

http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationAdapter.html

http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html

这里有一些示例代码:

http://azagorneanu.blogspot.co.uk/2013/06/transaction-synchronization-callbacks.html


2016 年更新

Spring 4.2 中引入的事件处理基础结构使这变得更加简单。

看:

https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2#transaction-bound-events

另一个流行的改进是能够将事件的侦听器绑定到事务的某个阶段。典型的示例是在事务成功完成时处理事件

@Component
public class MyComponent {

  @TransactionalEventListener(condition = "#creationEvent.awesome")
  public void handleOrderCreatedEvent(CreationEvent<Order> creationEvent) { 
    ...
  }

}

@TransactionalEventListener是一个常规,并且还公开了一个 TransactionPhase,默认值为AFTER_COMMIT。您还可以挂接事务的其他阶段(BEFORE_COMMIT、AFTER_ROLLBACK和AFTER_COMPLETION,这只是AFTER_COMMIT和AFTER_ROLLBACK的别名)。@EventListener


推荐