Java org.hibernate.PersistentObjectException:createQuery在select语句中传递给persist的分离实体

Java org.hibernate.PersistentObjectException:createQuery在select语句中传递给persist的分离实体,java,hibernate,jpa,exception,Java,Hibernate,Jpa,Exception,组和规则具有一对多的双向关系。当我在entityManager上调用getSingleResult方法时,我得到了传递给Persistent:Rule的PersistentObjectException:分离实体 查询是: entityManager.createQuery("select t from Template t join t.batchContacts bc join t.groups g where t.enabled = 1 and t.eventType.id=:event

组和规则具有一对多的双向关系。当我在entityManager上调用getSingleResult方法时,我得到了传递给Persistent:Rule的PersistentObjectException:分离实体

查询是:

entityManager.createQuery("select t from Template t join t.batchContacts bc 
join t.groups g where t.enabled = 1 and t.eventType.id=:eventTypeId and 
t.media=:media and bc.code =:contactCode and "
+ "g.id =:groupId and t.codes is null");
堆栈跟踪:

org.hibernate.PersistentObjectException: detached entity passed to persist: com.tosan.chapar.core.entity.Rule
    at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:127) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:834) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:826) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:357) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:425) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.engine.Cascade.cascade(Cascade.java:161) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88) ~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
Wrapped by: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.tosan.chapar.core.entity.Rule
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214) ~[hibernate-entitymanager-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147) ~[hibernate-entitymanager-3.6.0.Final.jar:3.6.0.Final]
    at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:307) ~[hibernate-entitymanager-3.6.0.Final.jar:3.6.0.Final]
    at com.tosan.chapar.core.persistence.jpa.TemplateDaoJpa.getTemplate(TemplateDaoJpa.java:262) ~[classes/:na]
    at com.tosan.chapar.core.service.impl.TemplateServiceImpl.findEnableGroupAndBatchTemplate(TemplateServiceImpl.java:280) ~[classes/:na]
    at com.tosan.chapar.core.service.impl.TemplateServiceImpl$$FastClassBySpringCGLIB$$2a5066e2.invoke(<generated>) ~[classes/:na]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.2.9.RELEASE.jar:4.2.9.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) ~[spring-aop-4.2.9.RELEASE.jar:4.2.9.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.2.9.RELEASE.jar:4.2.9.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.2.9.RELEASE.jar:4.2.9.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) ~[spring-tx-4.2.9.RELEASE.jar:4.2.9.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.2.9.RELEASE.jar:4.2.9.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.9.RELEASE.jar:4.2.9.RELEASE]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.2.9.RELEASE.jar:4.2.9.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.2.9.RELEASE.jar:4.2.9.RELEASE]
org.hibernate.PersistentObjectException:传递给persist的分离实体:com.tosan.chapar.core.entity.Rule
在org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:127)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:834)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:826)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:357)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:425)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.engine.Cascade.Cascade(Cascade.java:161)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)~[hibernate-core-3.6.0.Final.jar:3.6.0.Final]
包装者:javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:传递给persistent:com.tosan.chapar.core.entity.Rule的分离实体
在org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)~[hibernate-entitymanager-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)~[hibernate-entitymanager-3.6.0.Final.jar:3.6.0.Final]
在org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:307)~[hibernate-entitymanager-3.6.0.Final.jar:3.6.0.Final]
在com.tosan.chapar.core.persistence.jpa.TemplateDaoJpa.getTemplate(TemplateDaoJpa.java:262)~[classes/:na]
在com.tosan.chapar.core.service.impl.TemplateServiceImpl.findEnableGroupAndBatchTemplate(TemplateServiceImpl.java:280)~[classes/:na]
在com.tosan.chapar.core.service.impl.TemplateServiceImpl$$FastClassBySpringCGLIB$$2A506E2.invoke()~[classes/:na]
在org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)~[spring-core-4.2.9.RELEASE.jar:4.2.9.RELEASE]
在org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)~[spring-aop-4.2.9.RELEASE.jar:4.2.9.RELEASE]
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:157)~[spring-aop-4.2.9.RELEASE.jar:4.2.9.RELEASE]
在org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)~[spring-tx-4.2.9.RELEASE.jar:4.2.9.RELEASE]
在org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:281)~[spring-tx-4.2.9.RELEASE.jar:4.2.9.RELEASE]
在org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)~[spring-tx-4.2.9.RELEASE.jar:4.2.9.RELEASE]
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)~[spring-aop-4.2.9.RELEASE.jar:4.2.9.RELEASE]
在org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)~[spring-aop-4.2.9.RELEASE.jar:4.2.9.RELEASE]
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)~[spring-aop-4.2.9.RELEASE.jar:4.2.9.RELEASE]

我读了类似的问题,并尝试调试。但我仍然不明白为什么会出现这种异常,以及怎样才能避免它。我需要一些东西来澄清我为什么会这样,以及如何以最小的副作用解决问题,因为这些实体在我的项目中使用不同的位置,我没有时间测试所有的场景。

你会得到这个异常,因为为了让这个查询返回你期望的东西,Hibernate需要在执行查询之前刷新内存中的所有更改。这会导致在刷新期间发生持久化操作,并且由于您试图以某种方式持久化分离的实体,因此会出现该异常。所以问题不在于查询。它是在执行查询之前执行的代码。和往常一样,异常堆栈跟踪将确认这一点,但和往常一样,这不是问题…@JBNizet谢谢。我更新了我的问题。添加了堆栈跟踪。堆栈跟踪确认了我在前面的评论中所说的一切。问题在于执行该查询之前执行的代码。@JBNizet我检查了方法,但它们不会更改对象的状态。他们只选择objetc。那为什么冬眠时会出现潮水呢。我应该得到例外