如何从JPA获取分离的对象

时间:2013-02-14 12:34:00

标签: jpa jpa-2.0 eclipselink

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

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

1 个答案:

答案 0 :(得分:1)

如果您在事务外部获取它,则可以在不对detach()进行额外调用的情况下获取分离的实体。如果您没有使用容器管理的事务,那么这很简单,只是不要启动事务。

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

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

  • 从POJO调用EntityManager。您不必直接调用它,它只会激发查询结果将以非EJB对象结束。

AFAIK,没有预期的性能提升,因为查询结果将始终放在当前的持久性上下文中,但可能会有所缩短。

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

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

构造的类型必须具有包含所有相关属性的构造函数。列表中的对象,实体与否,将始终以分离方式创建。但是,实例化一个新对象的开销很小。