0

我有一个 jax-rs REST 服务,它发布一个

ArrayList<Book>

对象到服务器。

在服务器上,我遍历每本书,将其转换为 BookEntity(我正在使用 JPA),然后持久化每本书。

如果任何 BookEntity 无法持久化,我希望整个 POST 操作失败,并且提交的 ArrayList 中没有 Book Entity 被持久化。我想回滚整个操作,使其全部或全无。

仅使用容器管理事务(我知道您只需注入您的实体管理器即可免费获得)就可以解决问题吗?还是我需要 JTA 才能做到这一点?我对自动完成事务管理的哪一部分感到有点困惑?

谢谢!

4

1 回答 1

1

仅仅注入一个实体管理器不会给你容器管理的事务。这些是为服务启用 CMT 的先决条件:

  1. 服务必须是 EJB(@Stateless、@Stateful、@MessageDriven)
  2. 服务必须定义@TransactionManagement(CONTAINER)。这是默认设置,因此可以省略整个注释
  3. 服务必须为其 JPA 操作使用 JTA 实体管理器。

如果满足所有先决条件,那么对于服务上的任何给定业务方法,容器将自动管理其事务。事务行为可以通过使用注解在一个方法一个方法的基础上进行微调TransactionAttribute,但默认是每个方法的:

  • 如果不存在事务,则启动一个
  • 当方法完成时,提交事务
  • 如果方法抛出异常,则回滚事务
于 2013-02-23T08:06:21.637 回答