如何从JPA获取分离的对象

如何从JPA获取分离的对象,jpa,jpa-2.0,eclipselink,Jpa,Jpa 2.0,Eclipselink,在我的应用程序中,我需要以分离模式获取大多数对象(使用find API获取)。 我想知道是否有一种方法可以向JPA提供程序请求分离的对象,并保存对detach()API的额外调用。 另外,我希望在这种模式下创建的对象成本更低,因为JPA提供程序不需要将其添加到实体管理器上下文中。 有没有办法通过JPA API实现这一点? 有没有办法通过查询结果实现这种功能 具体地说,我使用的是eclipselink,所以如果有一种特定的方法来实现它,它也会很有帮助 如果在事务外部获取分离的实体,则无需额外调用

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

  • 具体地说,我使用的是eclipselink,所以如果有一种特定的方法来实现它,它也会很有帮助
如果在事务外部获取分离的实体,则无需额外调用
detach()
即可获取该实体。如果您不使用容器管理的事务,这很简单,只是不要启动事务

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

  • 如果在EJB中,则通过以下方式暂停事务:
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)

  • 从POJO调用
    EntityManager
    。您不必直接调用它,重要的是查询结果将以非EJB对象结束
顺便说一句,由于查询结果总是放在当前的持久性上下文中,不管它的寿命有多短,因此没有预期的性能增益

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

List<DTO> dtos = em.createQuery("SELECT NEW com.example.DTO( o.title, o.version) FROM Entity o").getResultList();
List dtos=em.createQuery(“从实体o中选择新的com.example.DTO(o.title,o.version)).getResultList();
构造的类型必须具有具有所有相关属性的构造函数。列表中的对象(实体与否)将始终创建为分离。然而,实例化一个新对象的开销很小