You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JEE/EJB自定义未检查异常默认事务行为及JPA异常回滚咨询

关于JPA两个未检查异常的CMT事务回滚行为解答

咱先对齐一下核心规则:在你用的JEE 7容器管理事务(CMT)环境里,未检查异常(也就是RuntimeException及其子类)默认会触发事务回滚——除非这个异常被标注了@ApplicationException(rollback=false),才会跳过回滚。

接下来针对你问的两个JPA异常逐一说明:

1. javax.persistence.NonUniqueResultException

  • 这个异常是JPA定义的未检查异常,继承自RuntimeException,而且它本身没有被标注@ApplicationException(rollback=false)。
  • 在你的JBoss 7 GA环境下,只要在EJB或者ManagedBean的CMT事务方法里抛出这个异常,容器就会自动回滚当前事务。举个例子:你调用EntityManager.createQuery(...).getSingleResult()但查询返回了多条结果,触发这个异常,那之前在这个事务里做的所有数据库操作(比如插入、更新)都会被撤销。

2. javax.persistence.NoResultException

  • 和上面的异常完全同理,它也是RuntimeException的子类,同样没有@ApplicationException(rollback=false)的标注。
  • 所以在CMT模式下,抛出这个异常时,容器也会自动回滚当前事务。比如你调用getSingleResult()但完全没匹配到结果,抛出该异常,此时事务里的未提交操作都会被回滚。

如果你想让这两个异常不触发回滚?

如果业务需求需要抛出这两个异常但不回滚事务,你可以这么处理:

  • 方式一:自定义一个异常,给它加上@ApplicationException(rollback=false)注解,然后在代码里捕获JPA的这两个异常,再抛出你自定义的异常。
  • 方式二:在方法内部捕获这两个异常,不往外抛(比如做个默认值处理),这样容器感知不到异常,就不会触发回滚。

内容的提问来源于stack exchange,提问作者Lonzak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:36:06