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