2010-07-14 20 views
5

मेरा डेटा मॉडल स्कूलों और छात्रों से बना है। छात्रों के पास स्कूल के लिए एफके है जो वे हैं। मुझे समझ में नहीं आता कि संग्रह में डुप्लिकेट क्यों हैं, यानी जो, जो, मैरी, मैरी, टॉम, टॉम, आदि हाइबरनेट द्वारा उत्पन्न SQL क्वेरी सही है और डुप्लीकेट नहीं लौटाती है। मैं डुप्लीकेट को फ़िल्टर करने के लिए एक हैक लागू कर सकता हूं, लेकिन मैं अभी तक टूटी हुई खिड़की के साथ रहने के लिए तैयार नहीं हूं;) मैंने नीचे दिए गए कोड के प्रासंगिक टुकड़ों को पेस्ट करने का प्रयास किया है। किसी भी मदद की बहुत सराहना की!हाइबरनेट/जेपीए: बाल संग्रह में डुप्लिकेट

// SchoolJpa 

@OneToMany (
    mappedBy = "school", 
    targetEntity = StudentJpa.class, 
    fetch = FetchType.LAZY, 
    cascade = CascadeType.ALL 
) 
@Override 
public List<Student> getStudentsInternal() { 
    return super.getStudentsInternal(); 
} 

// SchoolImpl 

private List<Student> students = new ArrayList<Student>(); 

public List<Student> getStudents() { 
    return Collections.unmodifiableList(students); 
} 

public List<Student> getStudentsInternal() { 
    return students; 
} 

public void setStudentsInternal(List<Students> students) { 
    this.students = students; 
} 
+0

ऑब्जेक्ट पुनर्प्राप्त करने के लिए आप जिस विशिष्ट कोड का उपयोग कर रहे हैं वह क्या है? हाइबरनेट में कुछ प्रकार के एचक्यूएल के साथ कुछ ज्ञात समस्याएं हैं जो इस तरह की नकल को ट्रिगर करेंगे। – Jherico

उत्तर

1

हार्ड कोड का टुकड़ा से कहने के लिए लेकिन:

  1. सेट के विपरीत, आम तौर पर सूचीबद्ध करता है की अनुमति देते हैं डुप्लिकेट तत्वों (हाँ, मैं तुम्हें कहा क्वेरी डुप्लिकेट वापस नहीं करता है देखा है, लेकिन मैं बात करना चाहता था बाहर है कि आप शायद सही संग्रह प्रकार का उपयोग नहीं कर रहे हैं)।
  2. सुनिश्चित करें कि आप equals/hashCode ठीक से लागू करें (मुझे इस स्तर पर कोई समस्या है)।

वास्तव में, क्या आप पूरे मैपिंग दिखा सकते हैं? मुझे समझ में नहीं आ रहा है कि आपके पास एक ही क्षेत्र में कई गेटर्स और सेटर्स क्यों हैं।

+0

बराबर/हैशकोड सही ढंग से लागू किया गया है। एक सेट का उपयोग वास्तव में समस्या हल करता है, लेकिन मैं इसे एक हैक के रूप में मानता हूं। setStudentsInternal/getStudentsInternal केवल हाइबरनेट के लिए है (इन विधियों को इंटरफ़ेस पर परिभाषित नहीं किया गया है) - संग्रह addStudent, removeStudent और getStudents के साथ encapsulated है जो एक अपरिवर्तनीय संग्रह देता है। – Francois

+0

@ फ्रैंकोइस: 'सेट' का उपयोग करना एक हैक नहीं है लेकिन यह समस्या का वास्तविक कारण छुपा रहा है (शायद यही कारण है कि आप इसे एक हैक कहते हैं) लेकिन यदि आप अधिक कोड प्रदान नहीं करते हैं तो मैं और कुछ नहीं कह सकता (सटीक मैपिंग्स)। साथ ही, टेबल सामग्री प्रदान करने और क्वेरी/क्वेरी किए गए प्रश्नों से मदद मिलेगी। –

13

मेरा अनुमान है कि आपके पास एक FetchType.EAGER या स्कूल में अन्य मैपिंग है जो हाइबरनेट द्वारा बाहरी जुड़ाव क्वेरी जारी करने का कारण बनती है, जिसके परिणामस्वरूप सूची में डुप्लिकेट होंगे।

एसईटी के लिए स्विचिंग प्रकार काम करता है क्योंकि एक सेट स्वाभाविक रूप से समानता के आधार पर डी-डुप्लिकेट है, इसलिए बाहरी जॉइन क्वेरी द्वारा लौटाए गए डुप्लीकेट खो जाते हैं।

एक और अधिक पूरी तरह से Eran Medan उपलब्ध here द्वारा स्पष्टीकरण:

0

मेरे सोचता है कि आप संग्रह है कि पहले से ही उस वस्तु के लिए मौजूद चीजों जोड़ रहे हैं। कोड को देखे बिना सुनिश्चित नहीं हो सकता है कि आप स्कूल के छात्रों के संग्रह में सामान जोड़ रहे हैं, लेकिन यह मेरा अनुमान होगा।

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