यह एक बहुत ही सामान्य प्रश्न है, इसलिए यह उत्तर इस लेख पर आधारित है जो मैंने अपने ब्लॉग पर लिखा था।
अनेको के लिये एक
एक से कई तालिका संबंध निम्नानुसार दिखते हैं:

रिलेशनल डेटाबेस सिस्टम में, एक-से-कई टेबल रिलेशनशिप Foreign Keyबच्चे में एक कॉलम के आधार पर दो टेबल्स को जोड़ता है जो Primary Keyपेरेंट टेबल रो के संदर्भ को संदर्भित करता है।
ऊपर तालिका आरेख post_idमें, post_commentतालिका में स्तंभ तालिका id स्तंभ के Foreign Keyसाथ एक संबंध है :postPrimary Key
ALTER TABLE
post_comment
ADD CONSTRAINT
fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
@ManyToOne एनोटेशन
वन-टू-टेबल टेबल रिलेशनशिप को मैप करने का सबसे अच्छा तरीका @ManyToOneएनोटेशन का उपयोग करना है ।
हमारे मामले में, बाल इकाई, एनोटेशन का उपयोग करते हुए फॉरेन की कॉलम को PostCommentमैप करती है :post_id@ManyToOne
@Entity(name = "PostComment")
@Table(name = "post_comment")
public class PostComment {
@Id
@GeneratedValue
private Long id;
private String review;
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
}
JPA @OneToManyएनोटेशन का उपयोग करना
सिर्फ इसलिए कि आपके पास @OneToManyएनोटेशन का उपयोग करने का विकल्प है , इसका मतलब यह नहीं है कि यह हर एक-से-कई डेटाबेस संबंध के लिए डिफ़ॉल्ट विकल्प होना चाहिए । संग्रह के साथ समस्या यह है कि हम उनका उपयोग केवल तब कर सकते हैं जब बाल रिकॉर्ड की संख्या सीमित है।
@OneToManyएसोसिएशन को मैप करने का सबसे अच्छा तरीका यह है कि @ManyToOneसभी इकाई राज्य परिवर्तनों के प्रचार के लिए पक्ष पर निर्भर रहें:
@Entity(name = "Post")
@Table(name = "post")
public class Post {
@Id
@GeneratedValue
private Long id;
private String title;
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
//Constructors, getters and setters removed for brevity
public void addComment(PostComment comment) {
comments.add(comment);
comment.setPost(this);
}
public void removeComment(PostComment comment) {
comments.remove(comment);
comment.setPost(null);
}
}
मूल इकाई, Postमें दो उपयोगिता विधियाँ (जैसे addCommentऔर removeComment) हैं, जिनका उपयोग द्विदिश संघ के दोनों पक्षों को सिंक्रनाइज़ करने के लिए किया जाता है। जब भी आप एक द्विदिश संघ के साथ काम कर रहे हों, तो आपको हमेशा ये तरीके प्रदान करने चाहिए, अन्यथा, आप बहुत ही सूक्ष्म राज्य प्रसार मुद्दों का जोखिम उठाते हैं ।
यूनिडायरेक्शनल @OneToManyएसोसिएशन को टाला जा सकता है क्योंकि यह @ManyToOneद्विदिश @OneToManyएसोसिएशन का उपयोग करने से कम कुशल है ।
@OneToManyजेपीए और हाइबरनेट के साथ संबंध का सबसे अच्छा तरीका के बारे में अधिक जानकारी के लिए , इस लेख को देखें ।
एक से एक
एक-से-एक तालिका संबंध निम्नानुसार दिखता है:

रिलेशनल डेटाबेस सिस्टम में, एक-से-एक टेबल रिलेशनशिप Primary Keyबच्चे में एक कॉलम के आधार पर दो टेबल्स को जोड़ता है जो पेरेंट टेबल रो का एक Foreign Keyसंदर्भ भी है Primary Key।
इसलिए, हम कह सकते हैं कि चाइल्ड टेबल Primary Keyपैरेंट टेबल के साथ साझा करता है ।
उपरोक्त तालिका चित्र में, idमें स्तंभ post_detailsतालिका भी एक है Foreign Keyके साथ संबंध postतालिका id Primary Keyस्तंभ:
ALTER TABLE
post_details
ADD CONSTRAINT
fk_post_details_id
FOREIGN KEY (id) REFERENCES post
एनपीए का उपयोग एनोटेशन के @OneToOneसाथ@MapsId
@OneToOneरिश्ते को मैप करने का सबसे अच्छा तरीका उपयोग करना है @MapsId। इस तरह, आपको एक द्विदिश संघ की भी आवश्यकता नहीं है क्योंकि आप हमेशा इकाई पहचानकर्ता PostDetailsका उपयोग करके इकाई ला सकते हैं Post।
मानचित्रण इस तरह दिखता है:
[कोड भाषा = "java"] @Entity (नाम = "PostDetails") @Table (नाम = "post_details") सार्वजनिक वर्ग PostDetails {
@Id
private Long id;
@Column(name = "created_on")
private Date createdOn;
@Column(name = "created_by")
private String createdBy;
@OneToOne(fetch = FetchType.LAZY)
@MapsId
@JoinColumn(name = "id")
private Post post;
public PostDetails() {}
public PostDetails(String createdBy) {
createdOn = new Date();
this.createdBy = createdBy;
}
//Getters and setters omitted for brevity
} [/ कोड]
इस तरह, idसंपत्ति प्राथमिक कुंजी और विदेशी कुंजी दोनों के रूप में कार्य करती है। आप देखेंगे कि पहचानकर्ता के पहचान के साथ आबादी के बाद से @Idकॉलम अब @GeneratedValueएनोटेशन का उपयोग नहीं करता है post।
@OneToOneजेपीए और हाइबरनेट के साथ संबंध का सबसे अच्छा तरीका के बारे में अधिक जानकारी के लिए , इस लेख को देखें ।
कई कई
कई-से-कई तालिका संबंध निम्नानुसार है:

रिलेशनल डेटाबेस सिस्टम में, कई-टू-टेबल टेबल रिलेशनशिप में दो पैरेंट टेबल को चाइल्ड टेबल के माध्यम से लिंक किया जाता है जिसमें दो पेरेंट टेबल Foreign Keyके Primary Keyकॉलम को संदर्भित करने वाले दो कॉलम होते हैं ।
ऊपर तालिका आरेख post_idमें, post_tagतालिका में स्तंभ Foreign Keyका postतालिका आईडी Primary Keyस्तंभ के साथ भी संबंध है :
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_post_id
FOREIGN KEY (post_id) REFERENCES post
और, tag_idमें स्तंभ post_tagतालिका एक है Foreign Keyके साथ संबंध tagतालिका आईडी Primary Keyस्तंभ:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag
जेपीए @ManyToManyमानचित्रण का उपयोग करना
यह आप many-to-manyजेपीए और हाइबरनेट के साथ तालिका संबंध कैसे बना सकते हैं :
@Entity(name = "Post")
@Table(name = "post")
public class Post {
@Id
@GeneratedValue
private Long id;
private String title;
@ManyToMany(cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@JoinTable(name = "post_tag",
joinColumns = @JoinColumn(name = "post_id"),
inverseJoinColumns = @JoinColumn(name = "tag_id")
)
private Set<Tag> tags = new HashSet<>();
//Getters and setters ommitted for brevity
public void addTag(Tag tag) {
tags.add(tag);
tag.getPosts().add(this);
}
public void removeTag(Tag tag) {
tags.remove(tag);
tag.getPosts().remove(this);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Post)) return false;
return id != null && id.equals(((Post) o).getId());
}
@Override
public int hashCode() {
return 31;
}
}
@Entity(name = "Tag")
@Table(name = "tag")
public class Tag {
@Id
@GeneratedValue
private Long id;
@NaturalId
private String name;
@ManyToMany(mappedBy = "tags")
private Set<Post> posts = new HashSet<>();
//Getters and setters ommitted for brevity
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tag tag = (Tag) o;
return Objects.equals(name, tag.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
tagsमें संघ Postइकाई केवल परिभाषित करता है PERSISTऔर MERGEझरना प्रकार के। जैसा कि इस लेख में बताया गया है , REMOVE इकाई राज्य परिवर्तन एक @ManyToManyजेपीए एसोसिएशन के लिए कोई मतलब नहीं है क्योंकि यह एक श्रृंखला विलोपन को ट्रिगर कर सकता है जो अंततः एसोसिएशन के दोनों पक्षों को मिटा देगा।
- जैसा कि इस लेख में बताया गया है , यदि आप द्विदिश संघों का उपयोग करते हैं तो ऐड / रिमूवल यूटिलिटी मेथड अनिवार्य हैं ताकि आप यह सुनिश्चित कर सकें कि एसोसिएशन के दोनों पक्ष सिंक में हैं।
Postक्योंकि यह किसी भी अद्वितीय व्यापार कुंजी का अभाव इकाई समानता के लिए इकाई पहचानकर्ता का उपयोग करता है। जैसा कि इस लेख में बताया गया है , आप समानता के लिए इकाई पहचानकर्ता का उपयोग तब तक कर सकते हैं जब तक आप यह सुनिश्चित कर लेते हैं कि यह सभी इकाई बदलावों के अनुरूप है ।
Tagइकाई एक अद्वितीय व्यवसाय कुंजी जो हाइबरनेट विशेष के साथ चिह्नित है है @NaturalIdएनोटेशन। जब ऐसा होता है, तो अद्वितीय व्यवसाय कुंजी समानता जांच के लिए सबसे अच्छा उम्मीदवार है ।
- संस्था में एसोसिएशन की
mappedByविशेषता यह इंगित करती है कि, इस द्विदिश संबंध में, इकाई एसोसिएशन का मालिक है। इसकी आवश्यकता तब होती है जब केवल एक पक्ष ही एक संबंध स्थापित कर सकता है, और परिवर्तन केवल इस विशेष पक्ष से डेटाबेस के लिए प्रचारित किए जाते हैं।postsTagPost
Setएक का उपयोग कर के रूप में, पसंद किया जा रहा है Listके साथ @ManyToManyकम कुशल है।
@ManyToManyजेपीए और हाइबरनेट के साथ संबंध का सबसे अच्छा तरीका के बारे में अधिक जानकारी के लिए , इस लेख को देखें ।