2011-12-20 19 views
7

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

जब हमारे पास एक से अधिक रिश्ते हैं, तो हमें हमेशा स्वामित्व पक्ष निर्दिष्ट करने के लिए कहा जाता है।

तो, उदाहरण के लिए यदि हमारे पास व्यक्ति और फोन नंबर के बीच एक से अधिक संबंध थे, तो हम इस तरह के कोड लिखेंगे।

@Entity 
class Person { 
    @OneToMany(mappedBy="person") 
    public Set<PhoneNumber> phoneNumbers; 
} 

@Entity 
class PhoneNumber { 
    @ManyToOne 
    public Person person; 
} 

उपर्युक्त कोड में, स्वामित्व वाली इकाई फ़ोन नंबर है। किसी भी पक्ष के मालिकों और मालिकों की स्वामित्व वाली संस्था क्या है?

मुझे एहसास है कि स्वामित्व वाली इकाई PhoneNUmber है, तो रिश्ते का प्रतिनिधित्व कई टन है, जिसके परिणामस्वरूप तालिका में शामिल नहीं होगा, जबकि जब स्वामित्व पक्ष व्यक्ति होता है, तो दर्शाया गया रिश्ता वनटॉनी होगा, इस मामले में एक रिश्ते की मेज होगी बनाया जाना

क्या यह स्वयं के पक्ष को निर्धारित करने का मुख्य कारण है, या अन्य कारण भी हैं?

अद्यतन: मैं सिर्फ महसूस किया कि this thread जवाब का हिस्सा प्रदान करता है, लेकिन मैं वहाँ अन्य बिंदुओं के रूप में अच्छी तरह से हो सकता है उम्मीद कर रहा हूँ।

उत्तर

1

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

जैसे कि आप पहले व्यक्ति को लाना चाहते हैं और फिर मांग पर फोन नंबर दिखाएं तो फोन में व्यक्ति संदर्भों को ठीक रखना ठीक है। सबसे पहले आप व्यक्ति डेटा लोड करने के लिए एक साधारण क्वेरी को फायर करते हैं और फिर केवल (पहले से लोड किए गए) व्यक्ति के आधार पर फ़ोन नंबरों को देखते हैं। (एक और सरल क्वेरी)

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

लेकिन काफी स्पष्ट रूप से, अगर आपको लगता है ORM के बजाय एसक्यूएल तो आप एक रिश्ते तालिका हर बार साथ जाना होगा: डी

+0

मैं जोर से सोचने की कोशिश कर रहा हूं। मान लें कि दोनों मामलों में, हम उत्सुकता प्राप्त करते हैं। पहले मामले के लिए, जहां फोन नम्बर स्वामित्व वाली इकाई है, हम सभी व्यक्तियों को प्राप्त करने के लिए पहली क्वेरी को आग लगा देंगे, और फिर उस व्यक्ति के लिए सभी फोन नंबर प्राप्त करने के लिए प्रत्येक व्यक्ति के लिए अलग-अलग प्रश्न पूछेंगे। हालांकि, अगर हमारे पास व्यक्ति के स्वामित्व वाले व्यक्ति थे, तो हमें शामिल होने के साथ केवल एक प्रश्न की आवश्यकता होती है। मुझे खेद है कि यह एक मूर्ख सवाल है, लेकिन फोन नंबर में व्यक्ति एफके होने के साथ संभव नहीं है? – Parag

+0

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

+0

दिमाग में ओआरएम परत के साथ स्कीमा को डिज़ाइन नहीं करता है, इस धागे में मेरे उत्तर को 'मैप किए गए' और 'स्वामित्व वाले पक्ष' के कारणों के कारण भी देखें, क्या होता है अगर हम एक स्वामित्व वाली पक्ष को परिभाषित नहीं करते हैं, तो GOTCHA - http://stackoverflow.com/questions/2749689/what-is-the-owning-side-in-an-orm-mapping/21068644#21068644 –

6

एक महत्वपूर्ण बात को ध्यान में रखना है कि मालिक संबंध एक है कि वास्तव में जारी रहती है बचाने पर संबंध।

Person person = new Person(); 
    PhoneNumber pn = new PhoneNumber(); 
    pn.phone = "12345678"; 
    person.phoneNumbers.add(pn); 
    session.save(person); 

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

// the relation is not saved 
    Person loadedPerson = (Person)session.load(Person.class, person.id); 
    System.out.println(loadedPerson.phoneNumbers.size()); // prints 0! 

    pn.person = person; 
    session.save(pn); 

    loadedPerson = (Person)session.load(Person.class, person.id); 
    System.out.println(loadedPerson.phoneNumbers.size()); // prints 1 
संबंधित मुद्दे