1

在我的应用程序中,我需要以分离模式获取的大多数对象(使用 find API 获取)。
我想知道是否有办法从 JPA 提供者那里询问一个分离的对象并保存对 detach() API 的额外调用。
另外,我希望以这种模式创建的对象成本更低,因为 JPA 提供者不需要将其添加到实体管理器上下文中。
有没有办法通过 JPA API 实现这一点?
有没有办法通过查询结果实现这样的功能?

  • 具体来说,我使用的是 Eclipse Link,所以如果有一种特定的方法可以使用这个实现,它也会很有帮助。
4

1 回答 1

2

detach()如果您在事务之外获取它,则无需额外调用即可获取分离的实体。如果您不使用容器管理的事务,这很简单,只需不要启动事务。

如果您使用 CMT,则必须确保请求对象不是启用事务的 EJB:

  • 如果在 EJB 中,请通过使用以下内容注释适当的方法来暂停事务:@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED),

或者

  • EntityManager从 POJO调用。您不必直接调用它,重要的是查询结果将以非 EJB 对象结尾。

AFAIK,没有预期的性能提升,因为查询结果将始终放在当前的持久性上下文中,无论它可能是多么短暂。

编辑:还有另一种可能获得不依赖于事务分界的分离对象:JPA 构造函数表达式:

List<DTO> dtos = em.createQuery("SELECT NEW com.example.DTO( o.title, o.version) FROM Entity o").getResultList();

构造的类型必须有一个具有所有相关属性的构造函数。列表中的对象,无论是否实体,都将始终以分离的方式创建。然而,实例化一个新对象有一点开销。

于 2013-02-14T12:50:58.043 回答