当前位置:  开发笔记 > 编程语言 > 正文

从JPA/EJB3持久性上下文中分离实体

如何解决《从JPA/EJB3持久性上下文中分离实体》经验,为你挑选了4个好方法。

分离通过EntityManager获取的特定JPA实体Bean的最简单方法是什么?或者,我可以让查询首先返回分离的对象,这样它们基本上可以作为"只读"吗?

我想这样做的原因是因为我想修改bean中的数据 - 仅在我的应用程序中,但不会将其持久保存到数据库中.在我的程序中,我最终必须在EntityManager上调用flush(),它会将所有更改从附加实体持久保存到underyling数据库,但我想排除特定对象.



1> 小智..:

(可能为时已晚,无法回答,但对其他人有用)

我正在用JPA开发我的第一个系统.不幸的是,当这个系统几乎完成时,我遇到了这个问题.

简单的说.使用Hibernate,或等待JPA 2.0.

在Hibernate中,您可以使用'session.evict(object)'从会话中删除一个对象.在JPA 2.0中,现在在草案中,有一个'EntityManager.detach(object)'方法将一个对象与持久化上下文分离.


在这里http://download.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#detach(java.lang.Object)
现在恰好一年之后.我有这个问题,我在EntityManager上找不到任何"detach"方法调用.它出于某种原因被丢弃了吗?

2> Heidarzadeh..:

无论您使用哪种JPA实现,只需entityManager.detach(object)在JPA 2.0和JEE6中使用它.


好的,JPA 1.0怎么样?

3> James McMaho..:

如果您需要从EntityManager中分离对象,并且您正在使用Hibernate作为底层ORM层,则可以访问Hibernate Session对象并使用Mauricio Kanada上面提到的Session.evict(Object)方法.

public void detach(Object entity) {
    org.hibernate.Session session = (Session) entityManager.getDelegate();
    session.evict(entity);
}

当然,如果您切换到另一个ORM提供程序,这会破坏,但我认为这最好是尝试制作一个深层副本.



4> Andrei..:

不幸的是,在当前的JPA实现AFAIR中,没有办法将一个对象与实体管理器断开连接.

EntityManager.clear()将断开所有 JPA对象,因此在所有情况下可能不是合适的解决方案,如果您有其他对象计划保持连接.

因此,最好的办法是克隆对象并将克隆传递给更改对象的代码.由于原始和不可变对象字段由默认克隆机制以适当的方式处理,因此您不必编写大量管道代码(除了深度克隆您可能具有的任何聚合结构).

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有