带拦截器的 Hibernate 5 和事务回滚检测

Zip*_*per 5 java spring hibernate jpa transactions

我们有一个Hibernate拦截这是拦截afterTransactionCommit和检查事务wasCommited(),但我们最近升级到休眠5.0.7.Final,和休眠5不再有这一呼吁,当我们调用的getStatus()函数,我们只有每似乎得到两种ACTIVENOT_ACTIVE不分的交易状态。

我看了看,afterTransactionBegin交易被标记为ACTIVE,这是预期的,并且beforeTransactionCompletion仍然被标记为ACTIVE,这又是预期的,但随后afterTransactionCommit被标记为NOT_ACTIVE,这对我来说没有意义。我会期待其中之一COMMITTED, ROLLED_BACK, FAILED_COMMIT。无论事务状态如何,我都会得到这个,即使我抛出导致回滚的异常,我仍然看不到除NOT_ACTIVE.

我们寻找此信息的原因是为了确定我们是否需要将一些消息发布到队列中。基本上如果交易没有提交就不要发布。截至目前,使用 Hibernate 5 我似乎无法找到如何以编程方式确定事务是否成功。

Tim*_*gan 3

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);
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)