在我的应用程序中,我需要以分离模式获取的大多数对象(使用find API获取)
我想知道是否有办法从JPA提供程序中询问一个分离的对象并保存对detach()API的额外调用。
另外,我希望在这种模式下创建的对象更便宜,因为JPA提供者不需要将它添加到实体管理器上下文中。
有没有办法用JPA API实现这一目标?
有没有办法用查询结果实现这样的功能?
答案 0 :(得分:1)
如果您在事务外部获取它,则可以在不对detach()
进行额外调用的情况下获取分离的实体。如果您没有使用容器管理的事务,那么这很简单,只是不要启动事务。
如果您使用的是CMT,则必须确保请求对象不是启用事务的EJB:
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
,或
EntityManager
。您不必直接调用它,它只会激发查询结果将以非EJB对象结束。AFAIK,没有预期的性能提升,因为查询结果将始终放在当前的持久性上下文中,但可能会有所缩短。
编辑:还有另一种方法可以获得不依赖于事务划分的分离对象:JPA构造函数表达式:
List<DTO> dtos = em.createQuery("SELECT NEW com.example.DTO( o.title, o.version) FROM Entity o").getResultList();
构造的类型必须具有包含所有相关属性的构造函数。列表中的对象,实体与否,将始终以分离方式创建。但是,实例化一个新对象的开销很小。