तालिका संबंध बनाम इकाई संबंध
एक रिलेशनल डेटाबेस सिस्टम में, केवल तीन प्रकार के टेबल रिलेशनशिप हो सकते हैं:
- एक से कई (एक विदेशी कुंजी कॉलम के माध्यम से)
- एक-से-एक (एक साझा प्राथमिक कुंजी के माध्यम से)
- कई-से-कई (दो अलग-अलग पैरेंट टेबल के संदर्भ वाली दो विदेशी कुंजियों वाली लिंक तालिका के माध्यम से)
इसलिए, one-to-many
तालिका संबंध निम्नानुसार दिखता है:
ध्यान दें कि संबंध फॉरेन की कॉलम पर आधारित है (जैसे, post_id
चाइल्ड टेबल में ) ।
इसलिए, जब यह प्रबंध करने की बात आती है, तो सत्य का एक स्रोत होता है one-to-many
तालिका संबंध ।
अब, यदि आप एक द्विदिश इकाई संबंध लेते हैं जो नक्शे पर है one-to-many
पहले देखे तालिका संबंध :
यदि आप ऊपर दिए गए आरेख पर एक नज़र डालते हैं, तो आप देख सकते हैं कि इस संबंध को प्रबंधित करने के दो तरीके हैं।
में Post
इकाई, आपके पास comments
संग्रह:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
और इसमें PostComment
, post
एसोसिएशन निम्नानुसार मैप किया गया है:
@ManyToOne(
fetch = FetchType.LAZY
)
@JoinColumn(name = "post_id")
private Post post;
तो, आपके पास दो पक्ष हैं जो इकाई संघ को बदल सकते हैं:
comments
बाल संग्रह में एक प्रविष्टि जोड़कर , एक नयाpost_comment
पंक्ति post
को इसके माध्यम से मूल इकाई के साथ जोड़ा जाना चाहिएpost_id
स्तंभ के ।
- की
post
संपत्ति निर्धारित करकेPostComment
इकाई , post_id
कॉलम को भी अपडेट किया जाना चाहिए।
क्योंकि फॉरेन की कॉलम को दर्शाने के दो तरीके हैं, इसलिए आपको यह परिभाषित करना चाहिए कि जब एसोसिएशन राज्य परिवर्तन को अपने समकक्ष फॉरेन के कॉलम वैल्यू मॉडिफिकेशन में बदलने की बात करता है, तो सच्चाई का स्रोत है।
मैपेडबी (उर्फ उलटा पक्ष)
mappedBy
विशेषता बताता है कि @ManyToOne
पक्ष विदेशी कुंजी स्तंभ के प्रबंधन का कार्यभार में है, और संग्रह इकलौती संतान संस्थाओं को लाने के लिए प्रयोग किया जाता है बच्चों के लिए झरना मूल इकाई राज्य परिवर्तन करने के लिए (जैसे, माता पिता को दूर भी बच्चे संस्थाओं को दूर करना चाहिए)।
इसे प्रतिलोम पक्ष कहा जाता है क्योंकि यह बाल इकाई संपत्ति का संदर्भ देता है जो इस तालिका संबंध का प्रबंधन करता है।
एक द्विदिश संघ के दोनों पक्षों को सिंक्रनाइज़ करें
अब, भले ही आपने mappedBy
विशेषता को परिभाषित किया हो और चाइल्ड-साइड @ManyToOne
एसोसिएशन विदेशी कुंजी कॉलम का प्रबंधन करता है, फिर भी आपको द्विदिश संघ के दोनों पक्षों को सिंक्रनाइज़ करने की आवश्यकता है।
इन दो उपयोगिता विधियों को जोड़ने का सबसे अच्छा तरीका है:
public void addComment(PostComment comment) {
comments.add(comment);
comment.setPost(this);
}
public void removeComment(PostComment comment) {
comments.remove(comment);
comment.setPost(null);
}
addComment
और removeComment
तरीकों सुनिश्चित करना है कि दोनों पक्षों सिंक्रनाइज़ किए जाते हैं। इसलिए, यदि हम एक बाल इकाई को जोड़ते हैं, तो बाल इकाई को माता-पिता को इंगित करने की आवश्यकता होती है और माता-पिता इकाई को बच्चे को बाल संग्रह में समाहित करना चाहिए।
सभी द्विदिश इकाई संघ प्रकारों को सिंक्रनाइज़ करने के सर्वोत्तम तरीके के बारे में अधिक विवरण के लिए, इस लेख को देखें ।