如何使用JTA使用Jax-RS POST一个对象数组?

时间:2013-02-22 20:38:03

标签: json rest jpa jax-rs jta

我有一个发布

的jax-rs REST服务

ArrayList<Book>

服务器的对象。

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

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

仅仅使用容器管理事务(我知道您只需注入实体管理器即可免费获得)可以解决这个问题吗?或者我需要JTA才能这样做?关于事务管理的哪些部分是自动完成的,我有点困惑?

谢谢!

1 个答案:

答案 0 :(得分:1)

仅注入实体管理器并不会为您提供容器管理的事务。这些是为服务启用CMT的先决条件:

  1. 服务必须是EJB(@ Stateless,@ Stateful,@ MessageDriven)
  2. 服务必须定义@TransactionManagement(CONTAINER)。这是默认值,因此可以省略整个注释
  3. 服务必须使用JTA实体管理器进行JPA操作。
  4. 如果满足所有先决条件,则对于服务上的任何给定业务方法,容器将自动管理其事务。可以通过使用TransactionAttribute注释逐个方法地对事务行为进行微调,但默认情况下是针对每个方法:

    • 如果没有交易,请启动一个
    • 方法完成后,提交事务
    • 如果方法抛出异常,则回滚事务