এটি একটি খুব সাধারণ প্রশ্ন, সুতরাং এই উত্তরটি আমার ব্লগে আমার লেখা নিবন্ধের ভিত্তিতে তৈরি ।
এক থেকে অনেক
একের সাথে একাধিক টেবিলের সম্পর্কটি নীচে দেখায়:
একটি রিলেশনাল ডাটাবেস সিস্টেমে, এক-একাধিক টেবিলের সম্পর্কটি 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
সম্পর্ক রয়েছে :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
জেপিএ এবং হাইবারনেটের সাথে সম্পর্কের মানচিত্রের সর্বোত্তম উপায় সম্পর্কে আরও বিশদের জন্য এই নিবন্ধটি দেখুন ।