java – 使用拦截器进行Hibernate 5和Transaction回滚检测
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用拦截器进行Hibernate 5和Transaction回滚检测,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1271字,纯文字阅读大概需要2分钟。
内容图文
我们有一个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和Transaction回滚检测全部内容,希望文章能够帮你解决java – 使用拦截器进行Hibernate 5和Transaction回滚检测所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。