首页 > 解决方案 > JPA嵌套事务在运行时异常后全部提交/回滚

问题描述

经过一段时间阅读和测试不同形式的加载 EntityManager 实例和 bean 以进行一些嵌套事务,最后我没有找到一种方法,在运行时异常之后,数据完全回滚,必须接近我想要的阶段是当只有一个实体保留在数据库上时。情况如下:我有一个类实体 Car 和一个类实体 CarPart,Car 的一个实例可以包含 CarPart 的列表,我测试了持久性,当没有出现运行时错误时,一切都像一个魅力。问题是当抛出运行时错误时,例如数据库的触发错误控制器,有时对象会部分持久化。我将 JPA 与 JavaEE 和 EclipseLink 一起使用。我需要一种方法来控制对象将完全持久化或回滚每个持久化操作。任何帮助将不胜感激。

标签: javajpajakarta-eeentitymanager

解决方案


JPA 中不支持嵌套事务,也没有已知的“正确”方式。数据库数据的任何部分回滚也需要对象状态的部分回滚,这通常是在异常发生后唯一明智的做法是将您的 EntityManager 和关联的对象扔掉。

如果您使用 JavaEE 并将整个“用零件创建汽车”包装在单个事务中,则此行为应该可以开箱即用。如果您使用单独的事务(如我之前所述:没有办法使它们嵌套),那么汽车可能会被持久化,而零件则不会。

显而易见的解决方案是只为两者使用一个容器管理的事务。


推荐阅读