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

标签 java spring hibernate jpa transactions

我们有一个 Hibernate 拦截器拦截 afterTransactionCommit 并检查 wasCommited() 的事务,但我们最近升级到 Hibernate 5.0.7.Final 和 hibernate 5不再有此调用,当我们调用 getStatus() 函数时,无论事务如何,我们似乎都只能得到 ACTIVENOT_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/

相关文章:

java - JTree 数据未从数据库加载(MySQL)

java - Google App Engine Java小操作

java - Spring 中的属性范围

java - 在 Spring 服务器中发送长异步请求保持 Activity 状态

hibernate - hibernate 中找不到对象异常

java - 阻止 Hibernate 创建非空约束

java - 捕获嵌套到另一个异常中的异常

Java 有没有办法在不阻塞的情况下查看是否按下了某个键?

java - Spring,新线程中的实例变量可见性从@PostConstruct开始

java - hibernate原生SQL查询错误