เนื่องจากคำถามนี้เป็นคำถามที่พบบ่อยมากคำตอบนี้จึงมาจากบทความที่ฉันเขียนในบล็อกของฉัน
CascadeType ลบ
CascadeType.REMOVEกลยุทธ์ซึ่งคุณสามารถกำหนดค่าอย่างชัดเจน:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
หรือสืบทอดโดยปริยายจากCascadeType.ALLกลยุทธ์:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
อนุญาตให้คุณเผยแพร่การremoveดำเนินการจากเอนทิตีแม่ไปยังเอนทิตีลูก
ดังนั้นหากเราดึงPostเอนทิตีหลักพร้อมกับcommentsคอลเลกชันและลบpostเอนทิตี:
Post post = entityManager.createQuery("""
select p
from Post p
join fetch p.comments
where p.id = :id
""", Post.class)
.setParameter("id", postId)
.getSingleResult();
entityManager.remove(post);
ไฮเบอร์เนตจะเรียกใช้คำสั่งลบสามคำสั่ง:
DELETE FROM post_comment
WHERE id = 2
DELETE FROM post_comment
WHERE id = 3
DELETE FROM post
WHERE id = 1
PostCommentหน่วยงานที่เด็กถูกลบเนื่องจากCascadeType.REMOVEกลยุทธ์ซึ่งทำหน้าที่เป็นถ้าเราได้นำหน่วยงานของเด็กได้เป็นอย่างดี
กลยุทธ์การกำจัดเด็กกำพร้า
กลยุทธ์การกำจัดเด็กกำพร้าซึ่งต้องตั้งค่าผ่านorphanRemovalแอตทริบิวต์:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
อนุญาตให้คุณลบแถวตารางลูกเมื่อลบเอนทิตีลูกออกจากคอลเลกชัน
ดังนั้นหากเราโหลดPostเอนทิตีพร้อมกับcommentsคอลเล็กชันและลบรายการแรกPostCommentออกจากcommentsคอลเล็กชัน:
Post post = entityManager.createQuery("""
select p
from Post p
join fetch p.comments c
where p.id = :id
order by p.id, c.id
""", Post.class)
.setParameter("id", postId)
.getSingleResult();
post.remove(post.getComments().get(0));
ไฮเบอร์เนตจะดำเนินการคำสั่ง DELETE สำหรับpost_commentแถวตารางที่เกี่ยวข้อง:
DELETE FROM post_comment
WHERE id = 2
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับหัวข้อนี้โปรดอ่านบทความนี้เช่นกัน