TransactionSynchronization

TransactionSynchronization

我目前正在使用@PostPersist@PostUpdate,在这些触发器中,我将保留其他实体。问题是,是否在同一笔交易中触发了这些触发器?

对我来说,它是这样工作的。
当我查看日志时,该事务不存在(在启动触发器之前就已提交),这阻止了我(在注入(inject)的bean的持久化方法上没有REQUIRES_NEW)将其他实体保存在数据库中。REQUIRED属性被完全忽略,并且MANDATORY属性不会引发异常。

这可能是JUnit的问题(因为我处于开发阶段,并且没有在完整的环境中测试行为)?

如果无法在此触发器上扩展事务,如何确保如果回滚发生在@PostPersist@PostUpdate之前,则这些操作也将被回滚。

最佳答案

如果您使用的是Spring,则始终可以向当前的事务管理器注册一个TransactionSynchronization,以便在诸如当前正在运行的事务的提交之类的事件上进行回调:

@PostPersist
void onPersist() {
    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {

      @Override
      public void beforeCommit(boolean readOnly) {
        // do work
      }
    });
  }
}

在事务成功提交之后以及事务完成之前/之后,TransactionSynchronization还提供了回调。

如果您需要检查事务是否已提交或回滚,请使用afterCompletion(int status)

有关详细信息,请查看TransactionSynchronization's JavaDoc

10-04 10:07