分离通过EntityManager获取的特定JPA实体Bean的最简单方法是什么?或者,我可以让查询首先返回分离的对象,这样它们基本上可以作为"只读"吗?
我想这样做的原因是因为我想修改bean中的数据 - 仅在我的应用程序中,但不会将其持久保存到数据库中.在我的程序中,我最终必须在EntityManager上调用flush(),它会将所有更改从附加实体持久保存到underyling数据库,但我想排除特定对象.
(可能为时已晚,无法回答,但对其他人有用)
我正在用JPA开发我的第一个系统.不幸的是,当这个系统几乎完成时,我遇到了这个问题.
简单的说.使用Hibernate,或等待JPA 2.0.
在Hibernate中,您可以使用'session.evict(object)'从会话中删除一个对象.在JPA 2.0中,现在在草案中,有一个'EntityManager.detach(object)'方法将一个对象与持久化上下文分离.
无论您使用哪种JPA实现,只需entityManager.detach(object)
在JPA 2.0和JEE6中使用它.
如果您需要从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提供程序,这会破坏,但我认为这最好是尝试制作一个深层副本.
不幸的是,在当前的JPA实现AFAIR中,没有办法将一个对象与实体管理器断开连接.
EntityManager.clear()将断开所有 JPA对象,因此在所有情况下可能不是合适的解决方案,如果您有其他对象计划保持连接.
因此,最好的办法是克隆对象并将克隆传递给更改对象的代码.由于原始和不可变对象字段由默认克隆机制以适当的方式处理,因此您不必编写大量管道代码(除了深度克隆您可能具有的任何聚合结构).