2011-11-29 8 views
6

अगर मैं निम्न सूचीHibernateException: मिले एक ही संग्रह के दो अभ्यावेदन

@OneToMany(cascade=CascadeType.ALL, mappedBy="taskList") 
@OrderColumn(name="position", nullable=false) 
public List<Task> tasks = new ArrayList<Task>(); 

मैं अपवाद

org.hibernate.HibernateException: Found two representations of same collection 

प्ले में कोड प्राप्त युक्त एक वस्तु को बचाने!

TaskList taskList = taskList.findById(taskListId); 
taskList.add(position, task); 
taskList.save(); 

अगर मैं इस ब्लॉक से पहले यह काम करता है taskList.refresh() सम्मिलित है, लेकिन स्थिति जानकारी खो जाती है (जो अन्य त्रुटियों की ओर जाता है): नियंत्रक इस तरह दिखता है।

क्या यह एक हाइबरनेट बग है या मेरे कोड के साथ कुछ गलत है?

उत्तर

10

समस्या यह थी कि हाइबरनेट @OneToMany(mappedBy=...) और @OrderColumn के संयोजन का समर्थन नहीं करता है। mappedBy के बिना हाइबरनेट एक जॉइन टेबल का उपयोग करता है और सब कुछ अपेक्षित काम करता है। explanation देखें।

0

यदि आपको लगातार बने रहने की सूची की आवश्यकता है तो आपको अपनी इकाई को जारी रखने में सक्षम होने के लिए @OneToMany के साथ अपनी सूची को एनोटेट करने की आवश्यकता हो सकती है।

+0

आप सही कर रहे हैं: उदा .:

MyObject myObject = myObjectService.get(id); List<Task> newTasks = //populate new list of Task here myObject.setTasks(newTasks); myObjectService.saveOrUpdateObject(myObject); // or merge(myObject) 

इस तरह के एक मामले में, यह द्वारा हल किया जा सकता है। मैंने अपना उदाहरण छोटा करने के लिए इस एनोटेशन को छोड़ दिया - शायद एक बुरा विचार। – deamon

-1
समस्या

कि क्या आप किसी भी डेटा जो तालिका

0

अपवाद के लिए एक और कारण में नहीं है fatching नहीं कर रहे हैं अपने में शामिल होने की जांच के साथ कि "org.hibernate.HibernateException: मिले एक ही संग्रह के दो अभ्यावेदन" डुप्लिकेट ही टिककर खेल है/इकाई में सेटर्स।

0

वही त्रुटि होती है जब आप ऑब्जेक्ट के किसी संबंधित संग्रह को संशोधित करने का प्रयास करते हैं।

MyObject myObject = myObjectService.get(id); 
    List<Task> newTasks = //populate new list of Task here 
    myObject.setTasks(new List<Task>); // or myObject.getTasks().clear(); 
    myObject.getTasks().addAll(newTasks); 
    myObjectService.merge(myObject); 
संबंधित मुद्दे