เนื่องจากนี่เป็นคำถามที่พบบ่อยมากฉันจึงเขียน
บทความนี้ขึ้นมาซึ่งคำตอบนี้ขึ้นอยู่กับ
การเชื่อมโยงแบบหนึ่งต่อหลายทิศทางแบบทิศทางเดียว
ตามที่ฉันอธิบายในบทความนี้ถ้าคุณใช้@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
สมาคมที่เรียกกระหายซึ่งอาจทำให้เกิดปัญหา N + 1 แบบสอบถาม สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับหัวข้อนี้ตรวจสอบบทความนี้
ในPost
เอนทิตีcomments
สมาคมถูกแมปดังนี้:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
mappedBy
แอตทริบิวต์ของ@OneToMany
คำอธิบายประกอบอ้างอิงpost
คุณสมบัติในเด็กPostComment
นิติบุคคลและวิธีนี้ Hibernate รู้ว่าสมาคมสองทิศทางถูกควบคุมโดย@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);
}
วิธีการทั้งสองนี้ช่วยให้มั่นใจได้ว่าทั้งสองด้านของการเชื่อมโยงแบบสองทิศทางจะไม่ถูกซิงค์ ไฮเบอร์เนตไม่รับประกันว่าการเปลี่ยนแปลงสถานะการเชื่อมโยงจะเผยแพร่ไปยังฐานข้อมูล
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการวัดที่ดีที่สุดในการประสานความสัมพันธ์แบบสองทิศทางกับ JPA และ Hibernate ตรวจสอบบทความนี้
เลือกแบบไหน
การเชื่อมโยงทิศทางเดียว@OneToMany
ทำงานได้ไม่ดีนักดังนั้นคุณควรหลีกเลี่ยง
คุณจะดีกว่าการใช้แบบสองทิศทาง@OneToMany
ที่มีประสิทธิภาพมากขึ้น