Hibernate:org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联 [英] Hibernate: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session

查看:90
本文介绍了Hibernate:org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不知道为什么会发生这种异常,尽管它通过Hibernate的get / query方法来保证在Hibernate会话中检索已经可用的对象, pre> org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联:[xyzMyObject#130062] $ or $ $ b $ org.hibernate.engine.StatefulPersistenceContext .checkUniqueness(StatefulPersistenceContext.java:638)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:305)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener .java:246)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:112)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpda teEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
在org.hibernate.engine.CascadingAction $ 5.cascade(CascadingAction.java:252)
在org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
在org.hibernate。 engine.Cascade.cascadeAssociation(Cascade.java:335)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade。的java:在org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362 425)

。在org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338)
在org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
在org.hibernate.engine.Cascade.cascade(Cascade.java:161)
在org.hibernate.engine.Cascade .cascade(Cascade.java:127)
在org.hibernate.event.def.DefaultSaveOrUpdateE ventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:376)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:350)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached( DefaultSaveOrUpdateEventListener.java:246)美元,org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:57 b $ b)
在org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java: 93)
。在org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:742)
。在org.hibernate.impl.SessionImpl.update(SessionImpl.java:730)
。在有机.hibernate.impl.SessionImpl.update(SessionImpl.java:722)


解决方案

经过一些调试后,我发现我并没有停止在自引用模型中更新级联传播:

type1 - > type2 - > type3 - > collection(type1)



所有需要做的就是停止使用 cascade =none

 < set name =type1collection ... cascade =none> 
...
< / set>

也就是说,具有相同标识符值的不同对象已与会话被隐藏在自我介绍的孩子里面。这些孩子的额外更新是不必要的,所以没有级联是正确的。


I wonder why this exception happens although it's assured by Hibernate get/query methods to retrieve objects that are already available inside the Hibernate session in case those objects are required repeatedly:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [x.y.z.MyObject#130062]
    at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:638)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:305)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:112)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
    at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
    at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:425)
    at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:127)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:376)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:350)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246)
    at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:57)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:742)
    at org.hibernate.impl.SessionImpl.update(SessionImpl.java:730)
    at org.hibernate.impl.SessionImpl.update(SessionImpl.java:722)

解决方案

After some debugging I found out that I didn't stop cascading propagation of the update inside a self-referring model:

type1 --> type2 --> type3 --> collection(type1)

So all that needed to be done was to stop cascading with cascade="none" :

<set name="type1collection" ... cascade="none">
...
</set>

That means, a different object with the same identifier value was already associated with the session was hidden inside the self-referring children. The extra update of these children is unnecessary, so no cascading is correct.

这篇关于Hibernate:org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆