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

रिलेशनल डेटाबेस सिस्टम में, एक-से-कई टेबल रिलेशनशिप Foreign Key
बच्चे में एक कॉलम के आधार पर दो टेबल्स को जोड़ता है जो Primary Key
पेरेंट टेबल रो के संदर्भ को संदर्भित करता है।
ऊपर तालिका आरेख post_id
में, post_comment
तालिका में स्तंभ तालिका id स्तंभ के Foreign Key
साथ एक संबंध है :post
Primary 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
विशेषता यह इंगित करती है कि, इस द्विदिश संबंध में, इकाई एसोसिएशन का मालिक है। इसकी आवश्यकता तब होती है जब केवल एक पक्ष ही एक संबंध स्थापित कर सकता है, और परिवर्तन केवल इस विशेष पक्ष से डेटाबेस के लिए प्रचारित किए जाते हैं।posts
Tag
Post
Set
एक का उपयोग कर के रूप में, पसंद किया जा रहा है List
के साथ @ManyToMany
कम कुशल है।
@ManyToMany
जेपीए और हाइबरनेट के साथ संबंध का सबसे अच्छा तरीका के बारे में अधिक जानकारी के लिए , इस लेख को देखें ।