2010-06-02 16 views
21

में मैं जब डेटा पुन: प्राप्त हाइबरनेट 3,5जेपीए 2.0 @OrderColumn एनोटेशन हाइबरनेट 3.5

@OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
@OrderColumn(name = "pos") 
private List<Children> childrenCollection; 

साथ @OrderColumn एनोटेशन उपयोग करने के लिए कोशिश कर रहा हूँ, सब कुछ ठीक काम करता है। लेकिन मैं इसे सूची में तत्वों को पुन: व्यवस्थित नहीं कर सकता और डेटाबेस में नया ऑर्डर सहेज नहीं सकता।

+0

आप दिखा सकते हैं आप पुनः आदेश है अपनी सूची और बचाने के डेटाबेस पर वापस ??? –

+0

मैंने नई ऐरेलिस्ट और parent.setChildrenCollection (newList) मैंने पुनर्प्राप्ति सूची पर Collections.sort की कोशिश की है। मैंने संग्रह से शून्य वस्तुओं को हटाने का भी प्रयास किया है। कुछ नहीं हुआ। माता-पिता में अन्य चट्टान डेटाबेस में सहेजे गए थे, लेकिन सूची के साथ कुछ भी नहीं हुआ। –

+0

जेपीए 1.0 के लिए हाइबरनेट 3.5 नहीं है, और @ ऑर्डर कॉलम जेपीए 2.0 है ?! –

उत्तर

25

@OneToMany (mappedBy = "...") और @OrderColumn का संयोजन हाइबरनेट द्वारा समर्थित नहीं है। यह जेआईआरए मुद्दा इस अमान्य संयोजन का उपयोग करते समय एक और स्पष्ट त्रुटि संदेश फेंकने का अनुरोध ट्रैक करता है: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5390

मुझे लगता है कि यह मुख्य रूप से समर्थित नहीं है क्योंकि यह एक विषम संबंध पैटर्न है। उपर्युक्त टिप्पणियां इंगित करती हैं कि रिश्ते का "एक" पक्ष निर्धारित करता है कि रिश्ते को डेटाबेस में कैसे पहुंचाया जाएगा, लेकिन ऑर्डर/स्थिति केवल सूची की जांच करके "कई" पक्ष पर उपलब्ध है। यह संबंधों के स्वामित्व के लिए "कई" पक्ष के लिए अधिक समझ में आता है, क्योंकि वह पक्ष सदस्यता और तत्वों के क्रम दोनों के बारे में जानता है।

हाइबरनेट एनोटेशन डॉक्स कुछ विस्तार से इस स्थिति का वर्णन:

http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-collection-extratype-indexbidir

वैकल्पिक हल "mappedBy" विशेषता है, जो संघ एक के बजाय डिफ़ॉल्ट में शामिल होने तालिका रणनीति का उपयोग करने के कारण होगा दूर करने के लिए है लक्ष्य तालिका पर कॉलम। आप @ जॉइनटेबल एनोटेशन का उपयोग करके जॉइन टेबल का नाम निर्दिष्ट कर सकते हैं।

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

आप अभी भी "एक" साइड जावा में सुलभ करना चाहते हैं, यह

@ManyToOne 
@JoinColumn(name="...", insertable=false, updatable=false, nullable=false) 
+4

यह मजाकिया है कि स्पष्ट इंडेक्स कॉलम के लिए "आधिकारिक" उदाहरण वास्तव में संयोजन '@OneToMany (mappedBy = "...")' + '@ ऑर्डर कॉलम 'का उपयोग करता है (http: //docs.jboss में उदाहरण 7.8 देखें।संगठन/हाइबरनेट/कोर/3.6/संदर्भ/एन-यूएस/एचटीएमएल/संग्रह.html # संग्रह-अनुक्रमित) –

+2

इस उत्तर के बाद यह सहमति हुई कि स्थिति को वैसे भी समर्थित किया जाना चाहिए। गेल बैडनर: "मैं मानता हूं कि @OneToMany (mappedBy =" ... ") समर्थित होना चाहिए।" –

+1

क्या कोई और जेपीए प्रदाता (जैसे एक्लिप्ससेलिंक) है जो '@OneToMany (mappedBy = "...")' का समर्थन करता है? – deamon

3

साथ नक्शा आप संघ के मालिक पर OrderColumn निर्दिष्ट करने के लिए प्रयास करना चाहिए। या अपने मैपिंग में आप मालिक को बच्चे को डाल देते हैं, मालिक माता-पिता होना चाहिए (एक बिडरेक्शनल एसोसिएशन पर, मालिक वह है जिसके पास कीवर्ड मैप किया गया है, यहां आप इस कीवर्ड को माता-पिता की कक्षा में डाल दें, फिर आपका मतलब है कि माता-पिता का वर्ग मालिक नहीं है)

अपने बच्चों की कक्षा में आपके पास कीवर्ड मैप्ड होना चाहिए माता-पिता पर चयन करें। लेकिन बच्चों पर नहीं चयन।
और अपने माता पिता के वर्ग में आप एनोटेशन @JoinTable, कुछ इस तरह होना चाहिए:

@OneToMany(mappedBy = "parent",fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
@OrderColumn(name = "pos") 
@JoinTable(name = "<NAME_OF_YOUR_TABLE>", joinColumns = @JoinColumn(<JOIN_COLUMNS_...>) 
private List<Children> childrenCollection; 
9

कुछ इस तरह कार्य करें:

@Entity 
class Parent { 

    @OneToMany 
    @OrderColumn(name = "pos") 
    List<Child> children; 
} 

@Entity 
class Child { 

    @ManyToOne 
    Parent parent; 
    @Column(name = "pos") 
    Integer index; 

    @PrePersist 
    @PreUpdate 
    private void prepareIndex() { 
     if (parent != null) { 
      index = parent.children.indexOf(this); 
     } 
    } 
} 
+2

मुझे लगता है कि तैयार इंडेक्स() में इसे इंडेक्स = parent.children.indexOf (यह); में बदला जाना चाहिए अगर (अनुक्रमणिका == -1) अनुक्रमणिका = parent.children.size(); – cn123h

संबंधित मुद्दे