如何使用容器事务从jersey资源返回创建的实体ID?

时间:2014-01-29 20:00:25

标签: jpa transactions jersey

假设我在Jersey资源的POST方法中创建了一个新的Widget实体。此外,这个Jersey服务在Glassfish 4下运行,也是一个EJB,并且具有容器事务管理。

POST方法的最后一行类似于

return Response.ok(widget).build();

如果我手动控制事务,那么在调用em.persist()之后,我将拥有新Widget的主键。但由于容器正在处理事务,因此在我返回Response之后才会提交。因此主键尚未填写。

我想我可以使用注释来手动处理事务,但我认为可能有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

实际上我从未使用过Jersey,但听起来像是一个事务划分问题,可能你可以添加到你的DAO或数据库层方法@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW),这将暂停当前事务,你将启动新事务和方法事务将自动完成,然后您要查找的ID应该在那里。返回服务时,原始交易将再次进行。

我不知道这是否适用于球衣,但JPA解决方案就是这个。

答案 1 :(得分:0)

看起来你在一个Jersey Resource课程中同时拥有Rest api和dao。

如果你在Resource类上放置@Transactional属性这不好,你应该在API层中分离事务。,

最好分开以下各层:

  1. Rest -API(泽西资源类)
  2. 后端API(用于安全/访问控制和无效参数处理的API类)
  3. 服务和DAO(商业代码)
  4. 您应该将事务处理放在API层中,并使用默认注释值(Suported)。它通常包含在您的API类中的@Transactional。

    如果出现问题,所有交易都将被中止并回滚到我的api层。

    当你在后端api层返回实体对象时,你最终会在资源类上拥有pk id。