2011-11-19 15 views
7

का उपयोग करने के बीच अंतर मुझे @OneToMany और @ManyToMany के बीच अंतर को समझने में कुछ परेशानी हो रही है। जब मैं @OneToMany का उपयोग करता हूं तो यह एक जॉइनटेबल बनाने के लिए डिफ़ॉल्ट होता है और यदि आप मैप किए गए विशेषता को जोड़ते हैं तो आपके पास दो इकाइयों के बीच द्विपक्षीय संबंध होगा।@OneToMany और @ManyToMany

मैं एक Question कि कई Categories पास न हो, और एक Category कई Questions के हैं हो सकता है। मुझे समझ में नहीं आता कि मुझे @ManyToMany या @OneToMany का उपयोग करना चाहिए क्योंकि मेरे लिए यह बिल्कुल वही चीज़ लगता है, लेकिन शायद यह नहीं है।

क्या कोई इसे समझा सकता है?

उत्तर

15

अच्छा, अंतर उस डिज़ाइन में है जिसे आप ऑब्जेक्ट्स का उपयोग करके प्रतिबिंबित करने का प्रयास कर रहे हैं।

आपके मामले में, प्रत्येक Question को कई Categories पर असाइन किया जा सकता है - तो यह @*ToMany संबंध का संकेत है। अब आप अगर तय करने के लिए है:

  • प्रत्येक Category केवल एक Question (यह एक अद्वितीय बाधा जिसका अर्थ है कि कोई अन्य श्रेणी में एक ही प्रश्न उल्लेख कर सकते हैं में परिणाम होगा) यह करने के लिए आवंटित कर सकते हैं - यह होगा इस @ManyToMany संबंध होगा - हो @OneToMany संबंध,
  • प्रत्येक Category कई Questions में डाला गया हो सकता है (वहाँ Category तालिका में कोई अद्वितीय बाधा हो जाएगा)।

@OneToMany (प्रश्न -> श्रेणी)

इस संबंध तालिका केवल यदि आप स्पष्ट रूप से @JoinTable का उपयोग कर तो परिभाषित या में शामिल होने के द्वारा दर्शाया जा सकता है जब यह एक यूनिडायरेक्शनल रिश्ता है जो मालिक पक्ष में 'वन' पक्ष है (इसका मतलब है कि Question इकाई में आपके पास Categories का संग्रह है, लेकिन Categories में आपके पास Question का कोई संदर्भ नहीं है)।

यदि आप इसके बारे में सोचते हैं, तो यह काफी उचित लगता है कि जॉइन टेबल का उपयोग किया जाता है। Categories तालिका में एकाधिक पंक्तियों के साथ Question तालिका में एक पंक्ति के बीच कनेक्शन को सहेजने का कोई अन्य तरीका नहीं है।

हालांकि, यदि आप एक द्विपक्षीय संबंध मॉडल करना चाहते हैं तो आपको यह निर्दिष्ट करने की आवश्यकता है कि Category ('कई' पक्ष) संबंधों का स्वामित्व पक्ष है।इस मामले में डीबीएमएस Category तालिका में विदेशी कुंजी के साथ एक कॉलम कॉलम बना सकता है क्योंकि प्रत्येक Category पंक्ति केवल एक Question से जुड़ा जा सकता है।

इस तरह आपके पास कोई भी टेबल नहीं है लेकिन सरल विदेशी कुंजी (अभी भी, जैसा कि शुरुआत में इंगित किया गया है, आप @JoinTable का उपयोग करके शामिल तालिका बनाने के लिए मजबूर कर सकते हैं)।

@ManyToMany

यह रिश्ता एक मेज में शामिल होने के रूप में प्रतिनिधित्व किया जाना चाहिए। यह मूल रूप से unidirectional @OneToMany संबंधों के समान ही काम करता है, लेकिन इस मामले में आपके पास Question से कई पंक्तियां हो सकती हैं Categories से कई पंक्तियों में शामिल हो गईं।

+0

बहुत बढ़िया स्पष्टीकरण। बहुत अधिक अपवित्र होना चाहिए। – LppEdd

0

@ कई लोगों के रिश्ते दोनों पक्षों पर पारस्परिक रूप से संदर्भित विदेशी कुंजी हैं। कभी-कभी, यह संबंध आसन्न तालिका द्वारा मध्यस्थ होता है।

@OneToany रिश्तों में "एक" पक्ष पर एक विदेशी कुंजी है, न कि "कई" पक्ष पर। @OneToMany रिश्ते में, एक वस्तु "माता-पिता" है और एक "बच्चा" है। माता-पिता बच्चे के अस्तित्व को नियंत्रित करते हैं।

याद रखें कि @ManyToMany द्वि-दिशात्मक संबंध सममित नहीं होना चाहिए!

0

अपने प्रश्नों में & श्रेणियाँ केस, आपको @ManyToMany रिश्ते का उपयोग करना चाहिए। @ManyToMany मूल रूप से इसका मतलब है कि "एक प्रश्न एक ही समय में कई श्रेणियों से संबंधित हो सकता है" और "एक श्रेणी में एक ही समय में कई प्रश्न हो सकते हैं"। मैपिंग को स्टोर करने के लिए स्वचालित रूप से एक नई तालिका बनाई जाएगी। आपका कोड इस तरह दिखेगा:

@Entity 
public class Question implements Serializable { 
    ... 
    @ManyToMany 
    private List<Category> categories; 
    ... 
} 

@Entity 
public class Category implements Serializable { 
    ... 
    @ManyToMany 
    private List<Question> questions; 
    ... 
} 

आप अपने प्रश्न और श्रेणियाँ के लिए @OneToMany संबंध का उपयोग करते हैं, इसका मतलब है कि "एक प्रश्न केवल की हो सकती है (मान लीजिए कि एक पक्ष और अन्य पर प्रश्न पर श्रेणी जाने) एक श्रेणी "और" एक श्रेणी में एक ही समय में कई प्रश्न हो सकते हैं "। मैपिंग को स्टोर करने के लिए कोई नई टेबल की आवश्यकता नहीं है। इसके बजाए, एक तरफ आईडी को रिकॉर्ड करने के लिए कई तरफ एक नया फ़ील्ड स्वचालित रूप से बनाया जाएगा। आपका कोड इस तरह दिखेगा:

@Entity 
public class Question implements Serializable { 
    ... 
    @ManyToOne 
    private Category theCategory; 
    ... 
} 

@Entity 
public class Category implements Serializable { 
    ... 
    @OneToMany(mappedBy="theCategory") 
    private List<Question> questions; 
    ... 
} 
संबंधित मुद्दे