我们有一个 Hibernate 拦截器拦截 afterTransactionCommit
并检查 wasCommited()
的事务,但我们最近升级到 Hibernate 5.0.7.Final 和 hibernate 5不再有此调用,当我们调用 getStatus()
函数时,无论事务如何,我们似乎都只能得到 ACTIVE
或 NOT_ACTIVE
状态。
我查看了 afterTransactionBegin
并且交易被标记为 ACTIVE
,这是预期的,并且在 beforeTransactionCompletion
中它仍然被标记为 ACTIVE
,这又是预期的,但是在 afterTransactionCommit
中它被标记为 NOT_ACTIVE
,这对我来说没有意义。我本以为是 COMMITTED、ROLLED_BACK、FAILED_COMMIT
之一。无论事务状态如何,我都会得到这个,即使我抛出一个导致回滚的异常,我仍然看不到除 NOT_ACTIVE
之外的任何状态。
我们寻找这些信息的原因是为了确定我们是否需要将一些消息发布到队列中。基本上,如果交易未提交,则不要发布。截至目前使用 Hibernate 5,我似乎无法找到如何以编程方式确定事务是否成功。
最佳答案
Hibernate 5 删除了在其拦截器中检测回滚的能力。相反,我们可以捕获已回滚的事务并在未提交时推断回滚。
例如:
public class MyInterceptor extends EmptyInterceptor {
.
.
.
private static ThreadLocal<Boolean> wasCommited = new ThreadLocal();
@Override
public void beforeTransactionCompletion(Transaction tx) {
// not called for rollback
wasCommited.set(Boolean.TRUE);
}
@Override
public void afterTransactionCompletion(Transaction tx) {
if ( !Boolean.TRUE.equals(wasCommited.get()) ) {
try {
// handle transaction rolled back
}
finally {
wasCommited.set(null);
}
}
}
}
关于java - Hibernate 5 和带有拦截器的事务回滚检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35612433/