Spring hibernate,如何在事务提交或事务回滚后调用一些方法

Jos*_*zka 11 java spring hibernate transactions

我需要在事务成功或回滚后调用一些方法.我用的是

    <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"/>
Run Code Online (Sandbox Code Playgroud)

应用程序使用一些外部Web服务,当内部事务被回滚时需要"清理".有没有办法如何在不使用声明式事务管理的情况下实现此目的.

Jos*_*tin 25

  • 从休眠状态,您可以延伸EmptyInterceptor和覆盖 afterTransactionCompletion()方法,并在其注册 SessionFactoryBeanHibernateTransactionManager.

  • 从Spring开始,您可以在适当的时候扩展TransactionSynchronizationAdapter和覆盖afterCompletion()并注册 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 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • TransactionSynchronizationAdapter 已弃用。 (2认同)

Ala*_*Hay 18

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) { 
    ...
  }

}
Run Code Online (Sandbox Code Playgroud)

@TransactionalEventListener是常规的@EventListener并且还公开了TransactionPhase,默认为AFTER_COMMIT.您还可以挂钩事务的其他阶段(BEFORE_COMMIT,AFTER_ROLLBACK和AFTER_COMPLETION,它们只是AFTER_COMMIT和AFTER_ROLLBACK的别名).

  • @ tallkid24 - 这是我正在开发的项目的快速要点https://gist.github.com/mrasband/a36cf9bedce9fe39338e2641694e3502 (4认同)

Mic*_*dis 10

使用Spring 4+:不使用全局方面和配置的最简单/最干净的方法是基于我的答案:https://stackoverflow.com/a/43322052/986160

如果@Transactional在成功提交后需要对方法进行回调,只需在方法的开头添加:

@Service
public class OneService {

    @Autowired
    OneDao dao;

    @Transactional
    public void a transactionalMethod() {
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
            public void afterCommit(){
                //do stuff right after commit
                System.out.println("commit!!!");

            }
        });
        //do db stuff
        dao.save();
    }
}
Run Code Online (Sandbox Code Playgroud)