এটি একটি খুব সাধারণ প্রশ্ন, সুতরাং এই উত্তরটি আমার ব্লগে আমার লেখা নিবন্ধের ভিত্তিতে তৈরি ।
এক থেকে অনেক
একের সাথে একাধিক টেবিলের সম্পর্কটি নীচে দেখায়:

একটি রিলেশনাল ডাটাবেস সিস্টেমে, এক-একাধিক টেবিলের সম্পর্কটি Foreign Keyসন্তানের কলামের উপর ভিত্তি করে দুটি টেবিলের লিঙ্ক করে যা উল্লেখ করেPrimary Key পিতামাতার সারণির সারিটির ।
উপরে টেবিল ডায়াগ্রাম সালে post_idকলাম post_commentটেবিল একটি হয়েছে Foreign Keyসঙ্গে সম্পর্ক postটেবিল আইডি Primary Keyকলাম:
ALTER TABLE
post_comment
ADD CONSTRAINT
fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
পছন্দ করুন
একের মধ্যে একাধিক টেবিল সম্পর্কের মানচিত্রের সর্বোত্তম উপায় হ'ল ব্যবহার করা @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;
}
জেপিএ ব্যবহার করে @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যা দ্বিদলীয় অ্যাসোসিয়েশনের উভয় পক্ষকে সিঙ্ক্রোনাইজ করতে ব্যবহৃত হয় features আপনি যখনই দ্বিপাক্ষিক সংস্থার সাথে কাজ করছেন তখন আপনার সর্বদা এই পদ্ধতিগুলি সরবরাহ করা উচিত, অন্যথায়, আপনি খুব সূক্ষ্ম রাষ্ট্র প্রচারের ঝুঁকি নিয়ে থাকেন ।
দ্বি- নির্দেশমূলক সমিতিটিকে @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সত্তা আনতে পারেন তাই এইভাবে, আপনার দ্বিপাক্ষিক সংঘেরও দরকার নেই ।
ম্যাপিংটি দেখে মনে হচ্ছে:
[কোড ভাষা = "জাভা"] @ সত্ত্বা (নাম = "পোস্টডেটেল") @ টেবিল (নাম = "পোস্ট_ডেটেল") পাবলিক ক্লাস পোস্টডেটেলস {
@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সম্পর্ক রয়েছে :postPrimary 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সংজ্ঞায়িত করে । যেমন এই নিবন্ধে ব্যাখ্যা করা হয়েছে , সত্তা রাষ্ট্রের রূপান্তরটি জেপিএ সংস্থার জন্য কোনও অর্থবোধ করে না কারণ এটি একটি চেইন মোছার কারণ হতে পারে যা শেষ পর্যন্ত সমিতির উভয় পক্ষকে মুছে ফেলতে পারে।PERSISTMERGEREMOVE @ManyToMany
- যেমনটি এই নিবন্ধে ব্যাখ্যা করা হয়েছে , আপনি যদি দ্বিদ্বন্দ্বী সমিতিগুলি ব্যবহার করেন তবে ইউটিলিটি পদ্ধতিগুলি অ্যাড / রিমুভ করা বাধ্যতামূলক, যাতে আপনি নিশ্চিত করতে পারেন যে সমিতির উভয় পক্ষই সিঙ্কে রয়েছে।
Postযেহেতু এটি কোনো অনন্য ব্যবসা কী অভাব আছে সত্তা সমতার জন্য সত্তা সনাক্তকারী ব্যবহার করে। হিসাবে ব্যাখ্যা করা এই প্রবন্ধের তবে আপনি আপনার নিশ্চিত যে এটা জুড়ে সামঞ্জস্যপূর্ণ থাকে করতে যতদিন সমতার জন্য সত্তা সনাক্তকারী ব্যবহার করতে পারেন সত্তা রাষ্ট্র ট্রানজিশন ।
Tagসত্তা ব্যবসার একটি অনন্য কী ব্যবহার করুন যা হাইবারনেট-নির্দিষ্ট দিয়ে চিহ্নিত করা রয়েছে @NaturalIdটীকা। যখন এটির ক্ষেত্রে, অনন্য ব্যবসায়ের কীটি সমতা পরীক্ষার জন্য সেরা প্রার্থী ।
mappedByএর অ্যাট্রিবিউট postsমধ্যে সমিতি Tagসত্তা চিহ্ন যে, এই দ্বিমুখী সম্পর্ক,Post সত্তা সমিতি মালিক। এটি কেবল প্রয়োজন যেহেতু কেবল এক পক্ষই সম্পর্কের মালিক হতে পারে এবং পরিবর্তনগুলি কেবল এই নির্দিষ্ট দিক থেকে ডাটাবেসে প্রচার করা হয়।
Setএকটি ব্যবহার, পছন্দসই করা হয় Listসঙ্গে @ManyToManyকম কার্যকরী।
@ManyToManyজেপিএ এবং হাইবারনেটের সাথে সম্পর্কের মানচিত্রের সর্বোত্তম উপায় সম্পর্কে আরও বিশদের জন্য এই নিবন্ধটি দেখুন ।