/ / हाइबरनेट: org.hibernate.NonUniqueObjectException: समान पहचानकर्ता मान वाला एक अलग ऑब्जेक्ट पहले ही सत्र - जावा, हाइबरनेट, हाइबरनेट-मैपिंग से जुड़ा हुआ था

हाइबरनेट: org.hibernate.NonUniqueObjectException: समान पहचानकर्ता मान वाला एक अलग ऑब्जेक्ट पहले ही सत्र - जावा, हाइबरनेट, हाइबरनेट-मैपिंग से जुड़ा हुआ था

मुझे आश्चर्य है कि यह अपवाद क्यों होता है हालांकि यह हैहाइबरनेट द्वारा आश्वासन प्राप्त करने के लिए हाइबरनेट प्राप्त / क्वेरी विधियों द्वारा आश्वासन दिया गया है जो उन वस्तुओं को बार-बार आवश्यक होने पर पहले से ही हाइबरनेट सत्र के अंदर उपलब्ध हैं:

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)

उत्तर:

जवाब के लिए 2 № 1

कुछ डीबगिंग के बाद मुझे पता चला कि मैंने एक आत्म-संदर्भ मॉडल के अंदर अद्यतन के प्रसार को रोक नहीं दिया है:

टाइप 1 -> टाइप 2 -> टाइप 3 -> संग्रह (टाइप 1)

तो जो कुछ करने की जरूरत है वह कैस्केडिंग को रोकना था cascade="none" :

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

इसका मत, एक ही पहचानकर्ता मान के साथ एक अलग वस्तु पहले से ही सत्र के साथ जुड़ा हुआ था स्वयं को संदर्भित बच्चों के अंदर छुपाया गया था। इन बच्चों का अतिरिक्त अपडेट अनावश्यक है, इसलिए कोई कैस्केडिंग सही नहीं है।