2012-11-11 26 views
5

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

@NamedQuery(name = Question.FIND_BY_ID_EAGER, query = "SELECT q FROM Question q LEFT JOIN FETCH q.answers LEFT JOIN FETCH q.categories LEFT JOIN FETCH q.feedback LEFT JOIN FETCH q.participant WHERE q.id = :id"), 

मैं एक प्रश्न वस्तु कैसे प्राप्त करूं जो शुरू में आलसी लोड हो, सभी संबंधों के साथ उत्सुक हो?

उत्तर

23

यह हाइबरनेट में एक नहीं बल्कि बुरा समस्या है और वास्तव में सामान्य रूप में ORM।

क्या होता है कि कई (fetch) जुड़ने के बजाय एक बड़े कार्टशियन उत्पाद बनने का कारण बनता है। हमेशा के लिए अर्थात अन्य नए कॉलम में शामिल होने और नई पंक्तियाँ परिणाम में दिखाई देते हैं, एक (काफी) बड़े 'वर्ग' परिणाम के लिए अग्रणी।

हाइबरनेट को इस तालिका से ग्राफ को डिस्टिल करने की आवश्यकता है, लेकिन सही इकाइयों को सही कॉलम से मिलान करने के लिए पर्याप्त स्मार्ट नहीं है।

उदा।

मान लीजिए हम परिणाम

A B C 
A B D 

कौन सा बनने के लिए जरूरत है:

A 
| 
B 
/\ 
C D 

हाइबरनेट प्राथमिक कुंजी और कुछ एन्कोडिंग जादू, क्या ग्राफ होना चाहिए से घटा सकता है, लेकिन व्यवहार में यह इस पुल को स्पष्ट मदद की जरूरत है।

ऐसा करने का एक तरीका संबंधों पर हाइबरनेट विशिष्ट @IndexColumn या जेपीए मानक @OrderColumn निर्दिष्ट करके है।

उदा।

@Entity 
public class Question { 


    @ManyToMany 
    @JoinTable(
     name = "question_to_answer", 
     joinColumns = @JoinColumn(name = "question_id"), 
     inverseJoinColumns = @JoinColumn(name = "answer_id") 
    ) 
    @IndexColumn(name = "answer_order") 
    private List<Answer> answers; 

    // ... 
} 

इस उदाहरण में मैं एक अतिरिक्त कॉलम answer_order के साथ एक जॉइन टेबल का उपयोग कर रहा हूं। इस स्तंभ है, जो प्रति प्रश्न/उत्तर संबंध एक अनूठा अनुक्रमिक संख्या है के माध्यम से, हाइबरनेट परिणाम तालिका में प्रविष्टियों को अलग और आवश्यक वस्तु ग्राफ बना सकते हैं।

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

अतिरिक्त पठन:

+0

यह ध्यान देने योग्य है कि '@ IndexColumn' अब पदावनत है (वर्तमान में हाइबरनेट 5.2.4.Final का प्रयोग करके) – JRSofty