2013-06-25 3 views
5

मैं many to many दो वर्ग Person और Address के बीच संबंधों का प्रयास कर रहा हूं। मुझे नहीं पता लेकिन कहीं मैं सही लाइनों के साथ सोच नहीं रहा हूं। कई मानचित्रण के लिए कई के लिए उदाहरण के लिए, मैं दो तालिकाओंमुझे कई मैपिंग के लिए कई लोगों की तीसरी तालिका क्यों चाहिए? मैं सिर्फ दो टेबल का उपयोग क्यों नहीं कर सकता?

CREATE TABLE person(p_id INTEGER,p_name TEXT,PRIMARY KEY(p_id)); 
CREATE TABLE address(a_id INTEGER,address TEXT); 

बनाया और उसके बाद मैं मानचित्रण एक्सएमएल में कुछ करने की कोशिश की। कुछ असफल प्रयासों के बाद मैंने पढ़ा कि आपको कई मैपिंग के लिए कई तालिकाओं की आवश्यकता है, जैसे कि answer मेरे प्रश्न में से एक के अनुसार।

कृपया मुझे इसके कारण बताएं? मुझे तीसरी टेबल क्यों चाहिए? मैं सिर्फ दो तालिकाओं के साथ एक संघ क्यों नहीं बना सकता?

+0

क्यों डाउनवोट के रूप में मानचित्रण कर रहा था? –

+0

क्योंकि यह बहुत ही बुनियादी चीजें हैं जिन्हें आपको आसानी से – Zutty

+0

@ जुट्टी को देखने में सक्षम होना चाहिए। क्या आप जवाब जानते हैं .. अगर आप पोस्ट कर सकते हैं तो पोस्ट करें .. मेरे लिए यह एक अच्छा सवाल है। – kark

उत्तर

7

तीसरी तालिका एक जंक्शन तालिका के रूप में कार्य करती है जो कई लोगों को कई रिश्तों को परिभाषित करती है। आपके उदाहरण में मुझे लगता है कि Person में कई addresses हो सकते हैं और एक पता एकाधिक People से संबंधित हो सकता है। इस संबंध को दो टेबल का उपयोग करके मॉडलिंग नहीं किया जा सकता है।

आप प्रयास कर सकते हैं बस Person तालिका में Address के लिए एक विदेशी कुंजी या Address तालिका में Person के लिए एक विदेशी कुंजी शामिल करने। इनमें से प्रत्येक मैपिंग में one पक्ष होगा, जिसका अर्थ है one विशेष संस्थाओं के many के साथ मेल खाता है। इनमें से कोई भी विकल्प many to many संबंध प्राप्त नहीं करता है और अधिक जटिल संबंधों को मैप करने के लिए किसी तीसरे तालिका का उपयोग आवश्यक है।

many to many के रूप में मानचित्रित करने के लिए आपको एक दूसरे के साथ दोनों इकाइयों के कई उदाहरणों को जोड़ने में सक्षम होना चाहिए। यह पारंपरिक रूप से निम्नलिखित के माध्यम से किया जाता है:

Table A 
ID_A 

Table B 
ID_B 

Table C 
ID_A 
ID_B 
6

संबंध की प्रकृति के कारण।

तो मानचित्रण से आप Address मेज पर एक person_id स्तंभ जोड़ सकते हैं और प्रत्येक Address टपल करने के लिए सिर्फ एक Person इंगित होता है, एक एक-से-था।

Address 
+---------------------+ 
|id|p_id|address  | 
+---------------------+ 
| 1| 1 |some street 1| //one address uniquely points to one person 
+---------------------+ 
| 2| 2 |new street 5 | 
+---------------------+ 

ही एक-से-कई के लिए चला जाता है: एक Person कई Address तों हो सकता है, तो वहाँ कई tuples Address तालिका में एक ही person_id साथ होगा।

Address 
+---------------------+ 
|id|p_id|address  | 
+---------------------+ 
| 1| 1 |some street 1| //two addresses point to one person 
+---------------------+ 
| 2| 1 |new street 5 | 
+---------------------+ 

लेकिन क्या होगा अगर एक Person mutliple Address तों हो सकता है, लेकिन यह भी, एक Address कई को Person रों संबंधित हो सकता है? फिर Address तालिका में एक कॉलम person_id पर्याप्त नहीं होगा क्योंकि Address कई Person से संबंधित हो सकता है! तो आपको Person एस और Address es के सभी जोड़े को जोड़ने के लिए एक तीसरी तालिका की आवश्यकता है।

Assoc table 
+---------+ 
|a_id|p_id|  
+---------+ 
| 1 | 1 | //one address for two persons 
+---------+ 
| 1 | 2 | 
+---------+ 
| 2 | 3 | //two addresses for the same person 
+---------+ 
| 3 | 3 | 
+---------+ 
1

हममम मैं सुनिश्चित नहीं हूं लेकिन मुझे लगता है कि वह अपने मानचित्रण में एक "तीसरी कक्षा" बनाने और वास्तव में "तीसरे तालिका" (अन्यथा वह भी हाइबरनेट मानचित्रण के बारे में बात नहीं करेंगे) नहीं के बारे में बात कर रहा है।तो मुझे लगता है कि वह सिर्फ मेरे जवाब के लिए मैपिंग के साथ संघर्ष कर रहा है (और यह बाद में उसके हाइबरनेट मैपिंग के लिए उपयोगी होगा):

@ जॉइनटेबल एनोटेशन के लिए धन्यवाद, आपको तीसरे के लिए एक इकाई बनाने की आवश्यकता नहीं है तालिका। यदि आपके टेबल के बीच बहुत से संबंध हैं, तो आपको केवल 2 इकाइयां "व्यक्ति" और "पता" बनाना होगा, और प्रत्येक पक्ष पर @ जॉइनटेबल एनोटेशन बनाने के बिना कई से अधिक जादू लागू होंगे उनके बीच तीसरी तालिका के लिए एक इकाई।

EXCEPT यदि आपकी तीसरी तालिका में कुछ अतिरिक्त कॉलम हैं, और फिर उस स्थिति में आपके पास कोई विकल्प नहीं है तो आपको इस तीसरे तालिका के लिए एक विशिष्ट इकाई बनाना होगा (या अन्यथा आप उस अतिरिक्त कॉलम को नहीं प्राप्त कर सकते सिर्फ "व्यक्ति" और "पता" इकाइयां)।

अपने मानचित्रण के लिए कुछ उपयोगी लिंक:

http://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example-annotation/ http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/

0

इम जेपीए टिप्पणी के साथ ManyToMany का उपयोग कर, मैं अपने बहुमूल्य सुझाव की जरूरत है। (व्यक्ति और पता मानें। वही पता अधिक व्यक्ति (उसी पते पर रहना) को संदर्भित किया जाता है)। मुझे उस पते से एक व्यक्ति को हटाना है।

Person p1 = new Person(); 
    Person p2 = new Person(); 
    Address add1 = new Address(); 

    p1.add(add1); 
    p2.add(add1); 

दोनों व्यक्तियों को एक ही जोड़ रेफरी का उपयोग करना। साथ ही

add1.add(p1) ; 
    add1.add(p2) ; 

फिर मर्ज करने या आईआईटी मैप किए जाने पर लगातार बने रहें।

p1 - add1 p2 - add1

मैं, अकेले p2 को हटाना होगा जब मैं

p2.removeAddress(add1) 
    removeAddress(add1) { coll.remove(add1) } 

क्या होता है यह हाइबरनेट जेपीए प्रदाता द्वारा पता और के लिए प्रविष्टि हटा फिर से फिर से करने की कोशिश करता किया पता इकाई पर बने रहें और कहें "हटाई गई इकाई को जारी रखने के लिए पारित किया गया" और हेनसी लेनदेन रोल वापस होता है। मैं

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinTable(name = "XXXX", joinColumns = { @JoinColumn(name = "X1_ID", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "X2_ID", nullable = false, updatable = false) }) 
    private Collection<Parser> parsers; 


    Please share your ideas. 
संबंधित मुद्दे