检索时休眠 EntityExistsException

Posted

技术标签:

【中文标题】检索时休眠 EntityExistsException【英文标题】:Hibernate EntityExistsException on retrieval 【发布时间】:2014-08-04 12:26:53 【问题描述】:

我在以下查询中遇到了一个令人费解的 EntityExistsException -

TypedQuery<T> typedQuery = em.createQuery(query);
return result = typedQuery.getSingleResult(); // <-- exception thrown here

我认为这个异常通常应该在持久化时发生,而不是在检索时发生。您能否提供一些线索,在检索操作期间可能发生 EntityExistsException 的情况下?谢谢。

javax.persistence.EntityExistsException: 一个不同的对象 相同的标识符值已经与会话相关联: [...@d8e152db] 在 org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1735) ~[hibernate-entitymanager-4.3.0.Final.jar:4.3.0.Final] 在 org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677) ~[hibernate-entitymanager-4.3.0.Final.jar:4.3.0.Final] 在 org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:524) ~[hibernate-entitymanager-4.3.0.Final.jar:4.3.0.Final] 在 org.hibernate.jpa.criteria.compile.CriteriaQueryTypeQueryAdapter.getSingleResult(CriteriaQueryTypeQueryAdapter.java:71) ~[hibernate-entitymanager-4.3.0.Final.jar:4.3.0.Final] ... ...

【问题讨论】:

可能是这个***.com/questions/13762713/… 【参考方案1】:

您的em 可能已经加载了一个对象,当您执行typedQuery.getSingleResult() 时,您正在重新加载休眠缓存中的现有对象(导致上述异常)。因此,在运行键入的查询之前,请先刷新并清除,看看它是否有效

em.flush();
em.clear();

//and your typed query goes here

或者,如果您知道导致的确切对象,那么您可以这样做

session.evict(theExactObject)

【讨论】:

为什么不休眠然后返回缓存中的现有对象?或者有没有办法这样做?我正在实现一个网络应用程序,当用户提交表单时,本质上我失去了对实体的引用(只有 ID 的字符串值)。所以,我正在尝试重新查询实体对象。 您不应该重新查询,而是使用refresh() 方法,因此实体管理应该从数据库中为对象带来最新的对象更改。

以上是关于检索时休眠 EntityExistsException的主要内容,如果未能解决你的问题,请参考以下文章

OneToMany 关系中的休眠标准

休眠从对象中延迟获取嵌套列表

休眠中ManyToMany关系的无限递归

如何在 spring-data 中使用子图(使用休眠)?

日期的休眠条件

使用休眠的本机查询