检索时休眠 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的主要内容,如果未能解决你的问题,请参考以下文章