ORM मैपिंग में "स्वयं का पक्ष" क्या है?


128

वास्तव में मालिक पक्ष का क्या मतलब है? कुछ मानचित्रण उदाहरण ( एक से कई, एक से एक, कई से एक ) के साथ एक स्पष्टीकरण क्या है ?

निम्नलिखित पाठ जावा EE 6 प्रलेखन में @OneToOne के वर्णन का एक अंश है । आप इसमें अवधारणा के पक्ष को देख सकते हैं ।

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



5
मैं इसे पढ़ने तक खो गया था: javacodegeeks.com/2013/04/…
darga33

2
विदेशी कुंजी कॉलम के साथ DB तालिका को पक्ष के रूप में माना जाता है। तो उस DB तालिका का प्रतिनिधित्व करने वाली व्यावसायिक इकाई उस संबंध का स्वामी (मालिक-पक्ष) है। आमतौर पर नहीं, लेकिन ज्यादातर मामलों में ओविंग-साइड में @ जॉइनकॉल्यूमेंट एनोटेशन होगा।
डियाब्लो

जवाबों:


202

एक सहयोगी पक्ष की धारणा क्यों आवश्यक है:

एक द्विदिश संबंध के मालिक पक्ष का विचार इस तथ्य से आता है कि संबंधपरक डेटाबेस में वस्तुओं के मामले में कोई द्विदिश संबंध नहीं हैं। डेटाबेस में हमारे पास केवल अप्रत्यक्ष संबंध हैं - विदेशी कुंजी।

Ing स्वयं के पक्ष ’नाम का क्या कारण है?

हाइबरनेट द्वारा ट्रैक किए गए संबंध का मालिक पक्ष उस संबंध का पक्ष है जो डेटाबेस में विदेशी कुंजी का मालिक है।

समस्या क्या है कि पक्ष पक्ष की धारणा हल करती है?

एक पक्ष की घोषणा किए बिना मैप की गई दो संस्थाओं का एक उदाहरण लें :

@Entity
@Table(name="PERSONS")
public class Person {
    @OneToMany
    private List<IdDocument>  idDocuments;
}

@Entity
@Table(name="ID_DOCUMENTS")
public class IdDocument {
    @ManyToOne
    private Person person;
}

OO के दृष्टिकोण से यह मानचित्रण एक द्वि-दिशात्मक संबंध को परिभाषित नहीं करता है, लेकिन दो अलग-अलग दिशात्मक संबंध है।

मानचित्रण न केवल तालिकाएँ PERSONSऔर बनाएगा ID_DOCUMENTS, बल्कि एक तृतीय संघ तालिका भी बनाएगा PERSONS_ID_DOCUMENTS:

CREATE TABLE PERSONS_ID_DOCUMENTS
(
  persons_id bigint NOT NULL,
  id_documents_id bigint NOT NULL,
  CONSTRAINT fk_persons FOREIGN KEY (persons_id) REFERENCES persons (id),
  CONSTRAINT fk_docs FOREIGN KEY (id_documents_id) REFERENCES id_documents (id),
  CONSTRAINT pk UNIQUE (id_documents_id)
)

केवल प्राथमिक कुंजी pkपर ध्यान दें ID_DOCUMENTS। इस मामले में हाइबरनेट संबंध के दोनों पक्षों को स्वतंत्र रूप से ट्रैक करता है: यदि आप संबंध में एक दस्तावेज जोड़ते हैं Person.idDocuments, तो यह एसोसिएशन तालिका में एक रिकॉर्ड सम्मिलित करता है PERSON_ID_DOCUMENTS

दूसरी ओर, यदि हम कॉल करते हैं, तो हम idDocument.setPerson(person)टेबल पर विदेशी कुंजी व्यक्ति_आईडी को बदलते हैं ID_DOCUMENTS। हाइबरनेट एक द्विदिश वस्तु संबंध को लागू करने के लिए डेटाबेस पर दो यूनिडायरेक्शनल (विदेशी कुंजी) संबंध बना रहा है।

कैसे पक्ष की धारणा समस्या को हल करती है:

कई बार हम क्या चाहते हैं मेज पर केवल एक विदेशी कुंजी है ID_DOCUMENTSकी दिशा में PERSONSऔर अतिरिक्त संघ तालिका।

इसे हल करने के लिए हमें संबंध पर संशोधनों को रोकने के लिए हाइबरनेट को कॉन्फ़िगर करने की आवश्यकता है Person.idDocuments। सीतनिद्रा में होना केवल संबंध के दूसरे पक्ष को ट्रैक करना चाहिए IdDocument.person, और ऐसा करने के लिए हम मैप किए गए हैं :

@OneToMany(mappedBy="person")
private List<IdDocument>  idDocuments;

इसका मतलब क्या है मैप किया गया?

इसका अर्थ कुछ इस प्रकार है: "संबंध के इस पक्ष में संशोधन पहले से ही मैप किए गए हैं संबंध के दूसरे पक्ष से IdDocument.person, इसलिए किसी अतिरिक्त तालिका में इसे अलग से यहां ट्रैक करने की आवश्यकता नहीं है।"

क्या कोई GOTCHAs, परिणाम हैं?

का उपयोग करते हुए mappedBy , अगर हम केवल फोन person.getDocuments().add(document), में विदेशी कुंजी ID_DOCUMENTSहोगा नहीं , नया दस्तावेज़ से लिंक किया जा क्योंकि इस मालिक / संबंध का पता लगाया पक्ष नहीं है!

दस्तावेज़ को नए व्यक्ति से जोड़ने के लिए, आपको स्पष्ट रूप से कॉल करने की आवश्यकता है document.setPerson(person), क्योंकि यह संबंध का अपना पक्ष है।

मैप किए गए का उपयोग करते समय , डेवलपर की यह जिम्मेदारी होती है कि वह यह जान सके कि मालिक का पक्ष क्या है, और डेटाबेस में नए संबंध की दृढ़ता को ट्रिगर करने के लिए संबंध के सही पक्ष को अपडेट करें।


17
सबसे अच्छा जवाब मुझे लगता है कि डॉक्ट्रिन 'मैपेडबी' + 'उलटबाय' की व्याख्या करता है।
कर्ट ज़ोंग

1
मैपिंग और अवधारणा के पीछे के कारण को निर्दिष्ट करने के लिए धन्यवाद।
मोहनीश

1
मुझे नहीं पता कि चीजें बदल गई हैं, लेकिन हाइबरनेट 5.0.9 पर। यदि मैं केवल "कॉल" करता हूं person.getDocuments().add(document), तो हाइबरनेट विदेशी कुंजी को अपडेट करता है ID_DOCUMENTS
निकोलस

1
@ कार्ल निकोलस, हाय, आपसे सहमत हैं कि हमारे पास @OneToManyएनोटेशन पर कैस्केड विशेषता है जो कि इस मामले में PERSIST पर सेट की जा सकती है हाइबरनेट सभी लिंक किए गए संस्थाओं को DB में बचाएगा। क्या कोई इसे स्पष्ट कर सकता है - क्यों लेखक कहता है कि हाइबरनेट गैर-स्वामित्व वाले पक्ष पर परिवर्तनों को ट्रैक नहीं करेगा - लेकिन वास्तव में हाइबरनेट किए गए ट्रैक पर नज़र रखता है?
बजे ऑलेक्ज़ेंडर पापचेंको

3
कैसकेड प्रदाता को बताता है कि यदि मूल संस्था उनके पास नहीं है, तो भी बच्चे को बचाने के लिए, इसलिए यह प्रभावी रूप से नियम को संशोधित करता है। यदि आपके पास मैप किया हुआ (या) mBBy = child.field है और कैस्केड नहीं किया है, तो सूची के बच्चों को नहीं बचाया जाएगा। इसके अलावा, यदि आपने मैप नहीं किया है और कैस्केड नहीं किया है, तो अभिभावक संबंध बनाते हैं और यदि आप नए बच्चों को सूची में डालते हैं और फिर माता-पिता को बचाते हैं तो यह एक अपवाद फेंक देगा क्योंकि नए बच्चे आईडी उपलब्ध नहीं हैं। ज्वाइन टेबल में सेव हो। आशा है कि चीजों को स्पष्ट करता है ... :)
K.Nicholas 15

142

आप कल्पना कर सकते हैं कि मालिक पक्ष वह इकाई है जिसमें दूसरे के लिए संदर्भ है। आपके उद्धरण में, आपके पास एक-से-एक संबंध है। चूँकि यह एक सममित संबंध है, इसलिए आप इस बात को समाप्त करेंगे कि यदि वस्तु A, B के साथ संबंध में है तो इसके विपरीत भी सत्य है।

इसका मतलब यह है कि ऑब्जेक्ट ए में ऑब्जेक्ट बी को रेफरेंस और ऑब्जेक्ट बी में ऑप्शन को सेव करने से ऑब्जेक्ट ए का संदर्भ बेमानी हो जाएगा: इसीलिए आप उस ऑब्जेक्ट को चुनते हैं, जिसके संदर्भ में दूसरे का "स्वामित्व" होता है।

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

कई-से-कई संबंधों के लिए, चूंकि आपको एक अलग मैपिंग टेबल की आवश्यकता होगी, वैसे भी कोई भी पक्ष नहीं होगा।

निष्कर्ष में मालिक पक्ष वह इकाई है जिसमें दूसरे का संदर्भ होता है।


6
अपने स्पष्टीकरण के लिए धन्यवाद।
बस एक शिक्षार्थी

2
यह 'मैपेडबी' और 'स्वयं की ओर' नामों के कारणों के साथ-साथ मेरे उत्तर को देखने में मदद कर सकता है, अगर हम एक सहयोगी पक्ष, गोचैकों को परिभाषित नहीं करते हैं तो क्या होता है, आशा है कि यह मदद करता है
कोणीय विश्वविद्यालय

5
खैर, जवाब ज्यादातर सही है मुझे लगता है। लेकिन हाइबरनेट के लिए कम से कम, यहां तक ​​कि कई-कई रिश्तों का एक ही पक्ष है। उदाहरण के लिए अद्यतन व्यवहार के लिए इसके निहितार्थ हैं। इस ट्यूटोरियल की धारा 4 ("अपडेट हाइबरनेट मॉडल क्लास") पर एक करीब से नज़र डालें: viralpatel.net/blogs/…
Pfiver

11
यह उत्तर जितना मदद करता है उससे अधिक भ्रमित करता है। यह कहना कितना अच्छा है कि "आप कल्पना कर सकते हैं कि मालिक पक्ष वह इकाई है जिसका दूसरे के साथ संदर्भ है" जब द्विदिश संबंधों में दोनों एंटिटी ऑब्जेक्ट एक दूसरे के लिए संदर्भ होंगे? इसके अलावा, "कई-से-कई संबंधों के लिए, चूंकि आपको एक अलग मैपिंग टेबल की आवश्यकता होगी, वैसे भी कोई भी पक्ष नहीं होगा" बस सादा गलत है: @ManyToManyरिश्तों के अपने पक्ष भी हैं। इसी तरह, @OneToManyरिश्ते तालिकाओं में शामिल हो सकते हैं, और आपको अभी भी एक मालिकाना पक्ष निर्दिष्ट करना होगा।
डेविड जूल

5
मूल रूप से, यह एक प्यारा, अच्छा-अच्छा जवाब है, जिसमें उत्थान है क्योंकि यह सच्चाई की तुलना में समझना आसान है।
डेविड जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.