如何通过容器交易从泽西资源返回创建的实体ID



假设我在泽西岛资源中的邮政方法中创建了一个新的窗口工具。此外,这项泽西岛服务在Glassfish 4下运行,也是EJB,并且具有容器交易管理。

邮政方法的最后一行是

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

如果我手动控制交易,则在调用em.persist()之后,我将拥有新小部件的主要键。但是,由于容器正在处理交易,因此直到我返回响应后才提交。因此,主要键尚未填写。

我想我可以使用注释手动处理交易,但是我认为可能有一种更好的方法?

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

我不知道这在泽西岛是否有效,但是JPA解决方案。

看起来您在一个泽西岛资源类中同时拥有REST API和DAO。

如果将@transactional属性放在资源类上不好,则应将API层的交易分开。

最好将层分开如下:

  1. 休息-API(泽西资源类)
  2. 后端API(用于安全/访问控制和无效参数处理的API类)
  3. 服务和DAO(商业代码)

您应该将事务处理放在API层中。它通常由您的API课程放置@transactional。

如果出现问题,所有交易将被中止并回滚i API层。

您将在返回实体对象FOM后端API层时在资源类上具有PK ID。

最新更新