我目前正在使用@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。