चूंकि यह एक बहुत ही सामान्य प्रश्न है, इसलिए मैंने यह लेख लिखा है
, जिस पर यह उत्तर आधारित है।
यूनिडायरेक्शनल एक से कई एसोसिएशन
जैसा कि मैंने इस लेख में बताया है , यदि आप @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 का उपयोग करने से बेहतर हैं जो अधिक कुशल है ।