HiAll को सौंपा गया थाहाइबरनेट: एक इकाई प्रति पहले से ही, एक अलग इकाई
मैं समझने के लिए वर्तमान में प्रयास करते हैं, क्या मेरी कोडिंग और इकाई मॉडल में गलत है मैं हाइबरनेट 4.2 CRUD आपरेशन के लिए उपयोग सिर्फ जेनेरिक डीएओ के साथ सभी और orphanRemoval = सच कैस्केडिंग के साथ पैटर्न और एनोटेटेड इकाइयां। मेरे पास डेप्लान इकाई डेप्लान एलिमेंट कमजोर इकाई के साथ OneToMany संबंध के साथ है। DayPlanElement java.util.Set में सहेजे गए हैं। प्रत्येक DayPlanElement में एक संपत्ति "ऑर्डर" है।
DayPlan भी एक इकाई व्यक्ति को OneToMany संबंध नहीं है। इकाई व्यक्ति java.util में सहेजा गया। सूची।
DayPlanElementDayPlanElementEntry कमजोर संस्था के लिए OneToMany संबंध नहीं है। java.util.Set बचाने के लिए इस्तेमाल किया। व्यक्ति इकाई भी डेप्लानएलेमेंटएन्ट्री कमजोर इकाई के साथ OneToMany संबंध। java.util.Set सहेजने के लिए उपयोग किया जाता है। डेप्लान, डेप्लान एलिमेंट और व्यक्ति इकाइयों में आईडी के रूप में, मेरे आवेदन द्वारा प्रबंधित स्ट्रिंग के रूप में आईडी है। DayPlanElementEntry कमजोर इकाई में एक समग्र आईडी है: एंबेडेड आईडी के साथ एनप्लेटेड डेप्लानएलेमेंटएन्ट्रीआईडी, जिसमें parentPersonId और dayPlanElementId शामिल है। यह
दूसरे शब्दों में कल्पना करें, यह एक तालिका मौजूद है, दिन योजना का प्रतिनिधित्व करता है। कॉलम 0 से 24 तक के घंटे हैं। पंक्तियां व्यक्ति हैं, जिन्हें दिन की योजना से परिचालन जारी रखना होगा। प्रत्येक कॉलम DayPlanElement इकाई होगी। प्रत्येक पंक्ति व्यक्ति इकाई होगी। और प्रत्येक सेल DayPlanElementEntry इकाई होगी।
यदि मैं सिर्फ तालिका में नए तत्वों (व्यक्तियों को भी) जोड़ता हूं और इसे हटा देता हूं (इसे सूची से भी हटा देता हूं और फिर DayPlanDAO.merge (dayPlan) को कॉल करता हूं - मुझे कैस्केडिंग और अनाथ रिमूवल पर आशा है) - मुझे कोई समस्या नहीं है।
सिर्फ अगर मैं दिया व्यक्तियों (सिर्फ java.util.List भीतर संचालन को हटाने) और कॉल DayPlanDAO.merge (dayPlan) को पुन: व्यवस्थित करने की कोशिश - निम्नलिखित excepion फेंक दिया जाएगा:
Caused by: java.lang.IllegalStateException:
Error occurred while storing entity
[DayPlanElementEntry [getDayPlanMode()=NONE, getCompositeId()=DayPlanElementEntryId [parentPersonId=874c8eac-8796-478d-a4d5-dd011f7d6a4b, dayPlanElementId=ab683a25-633e-419e-89b6-4aef7829d4f6], hashCode=-2039940039]].
An entity copy
[org.hw.domain.DayPlanElementEntry#DayPlanElementEntryId [parentPersonId=874c8eac-8796-478d-a4d5-dd011f7d6a4b, dayPlanElementId=ab683a25-633e-419e-89b6-4aef7829d4f6]]
was already assigned to a different entity
[org.hw.domain.DayPlanElementEntry#DayPlanElementEntryId [parentPersonId=874c8eac-8796-478d-a4d5-dd011f7d6a4b, dayPlanElementId=ab683a25-633e-419e-89b6-4aef7829d4f6]].
at org.hibernate.event.internal.EventCache.put(EventCache.java:192)
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:285)
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:151)
मैं इवेंट कैश को डिब्यूज करता हूं, समस्या समाधानों के लिए सीचिंग करता हूं, सफलता के बिना लागू बराबर() और हैशकोड() विधि - - ( नोटिस, मैं आईडी के बराबर() विधि के लिए उपयोग करता हूं। उदाहरण के लिए DayPlanElementEntry की समग्र आईडी। उस आईडी का उपयोग हैशकोड() द्वारा किया जाता है। मुझे त्रुटि संदेश नहीं समझा जाता है, तीन बार समान गुणों का उत्पादन किया जाएगा - आईडी!
मैं घटना कैश के लिए test class पाया है, लेकिन अब मैं निम्नलिखित उपयोग के मामले परीक्षण समझ में नहीं आता:
@Test
public void testCopyAssociatedWith2ExistingEntities() {
session.getTransaction().begin();
Simple entity1 = new Simple(1);
session.persist(entity1);
Simple copy1 = new Simple(1);
cache.put(entity1, copy1);
Simple entity2 = new Simple(2);
session.persist(entity2);
Simple copy2 = new Simple(2);
cache.put(entity2, copy2);
session.flush();
try {
cache.put(entity1, copy2);
fail("should have thrown IllegalStateException");
}
catch(IllegalStateException ex) {
// expected
assertTrue(ex.getMessage().startsWith("Error occurred while storing entity [org.hibernate.event.internal.EventCacheTest$Simple#1]."));
}
session.getTransaction().rollback();
}
....
@Entity
private static class Simple {
@Id
private int value;
public Simple(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
हम तो हम यह जारी रहती है आईडी = 1 के साथ सरल इकाई ENTITY1 है,। फिर हम सरल इकाई कॉपी 1 बनाते हैं और ईवेंट कैश में इसे मूल्य के रूप में डालते हैं। कुंजी के रूप में जारी इकाई * * प्रयुक्त। फिर हम क्रमांक 2 = के साथ एक सरल इकाई * * बनाते हैं, तो यह जारी रहती है, और उसके बाद प्रतिलिपि बनाने * * आईडी 2 के साथ इकाई और घटना कैश में मूल्य के रूप में डाल दिया। कुंजी के रूप में इकाई 2 उपयोग किया जाता है। ऐसी स्थिति गलत क्यों है और क्यों उम्मीद की जाती है, कि अवैध स्तर अपवाद को फेंक दिया जाना चाहिए ??
आपकी मदद के लिए धन्यवाद!
वही समस्या! कृपया, अगर आपको कोई समाधान मिल गया है - इसे –