当前位置: 首页 > 知识库问答 >
问题:

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

公冶伟
2023-03-14

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

    <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服务,当内部事务回滚时,这些服务需要“清理”。有没有一种方法可以在不使用声明性事务管理的情况下实现这一点。

共有3个答案

方宏才
2023-03-14
匿名用户

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

如果在成功提交后需要回调< code>@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();
    }
}

欧阳声
2023-03-14

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

Spring 4.2中引入的事件处理基础设施使这一过程更加简单。

参见:

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

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

@Component
public class MyComponent {

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

}

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

袁鸿达
2023-03-14

>

  • 从Hibernate,您可以扩展 EmptyInterceptor 并覆盖 afterTransactionCompletion() 方法,并在 SessionFactoryBeanHibernateTransactionManager 中注册它。

    从Spring开始,您可以扩展TransactionSynChronizationAdapter并在完成()之后覆盖并在适当的时候使用TransactionSynChronizationManager#ynsterSynChronation()进行注册。

    编辑

    使用 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 
        }
    }
    

  •  类似资料:
    • 问题内容: 事务成功或回滚后,我需要调用某些方法。我正在使用 该应用程序使用一些外部Web服务,这些内部Web服务在回滚内部事务时需要“清除”。有没有办法在不使用声明式事务管理的情况下完成此操作。 问题答案: 在Hibernate中,您可以扩展和覆盖 方法并将其注册在 或中。 在Spring中,您可以使用扩展,覆盖和注册 。 编辑 使用Spring Aop向所有带注释的方法添加同步的示例

    • 我正在尝试创建一个事务方法,该方法调用其他几个事务方法以保存一些相互依赖的db实体。如果任何调用失败,我希望事务完全回滚。但是,这不是观察到的行为。这是我的代码: 也有and,但是当事务在第二次调用时失败时,第一个被提交。

    • 我是WebServices的新手。Im通过标记为“Transacted”的camel路由向cxfendpoint发送webservice请求,并得到响应。在同一事务路由中,next语句抛出一个异常,以便我的异常处理程序回滚该事务。 我可以在我的事务回滚中找到其他东西,除了我的webservice请求响应,因为它已经提交了。

    • 以下是使用事务教程中描述的提交和回滚的代码示例。 此示例代码是基于前面章节中完成的环境和数据库设置编写的。 复制并将以下示例代码保存到:CommitAndRollback.java 中,编译并运行如下 - 编译并运行结果如下 -

    • 我在这里很困惑。JPA中的提交或回滚完成事务吗?我使用的是spring和容器管理的EntityManager。感谢任何回答。

    • 我正在使用spring-test运行JUnit测试,我的代码如下所示 我的问题是我希望我的测试不影响其他测试。所以我想为每个测试创建一些类似回滚的东西。我为此找了很多,但到目前为止一无所获。我使用Hibernate和MySql来实现这个