एक सहयोगी पक्ष की धारणा क्यों आवश्यक है:
एक द्विदिश संबंध के मालिक पक्ष का विचार इस तथ्य से आता है कि संबंधपरक डेटाबेस में वस्तुओं के मामले में कोई द्विदिश संबंध नहीं हैं। डेटाबेस में हमारे पास केवल अप्रत्यक्ष संबंध हैं - विदेशी कुंजी।
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)
, क्योंकि यह संबंध का अपना पक्ष है।
मैप किए गए का उपयोग करते समय , डेवलपर की यह जिम्मेदारी होती है कि वह यह जान सके कि मालिक का पक्ष क्या है, और डेटाबेस में नए संबंध की दृढ़ता को ट्रिगर करने के लिए संबंध के सही पक्ष को अपडेट करें।