在我的应用程序中,我需要以分离模式获取的大多数对象(使用 find API 获取)。
我想知道是否有办法从 JPA 提供者那里询问一个分离的对象并保存对 detach() API 的额外调用。
另外,我希望以这种模式创建的对象成本更低,因为 JPA 提供者不需要将其添加到实体管理器上下文中。
有没有办法通过 JPA API 实现这一点?
有没有办法通过查询结果实现这样的功能?
- 具体来说,我使用的是 Eclipse Link,所以如果有一种特定的方法可以使用这个实现,它也会很有帮助。
在我的应用程序中,我需要以分离模式获取的大多数对象(使用 find API 获取)。
我想知道是否有办法从 JPA 提供者那里询问一个分离的对象并保存对 detach() API 的额外调用。
另外,我希望以这种模式创建的对象成本更低,因为 JPA 提供者不需要将其添加到实体管理器上下文中。
有没有办法通过 JPA API 实现这一点?
有没有办法通过查询结果实现这样的功能?
detach()
如果您在事务之外获取它,则无需额外调用即可获取分离的实体。如果您不使用容器管理的事务,这很简单,只需不要启动事务。
如果您使用 CMT,则必须确保请求对象不是启用事务的 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();
构造的类型必须有一个具有所有相关属性的构造函数。列表中的对象,无论是否实体,都将始终以分离的方式创建。然而,实例化一个新对象有一点开销。