我们有一个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 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,spring,jpa,hibernate,transactions
来源: https://codeday.me/bug/20190608/1201277.html