เนื่องจากคำถามนี้เป็นคำถามที่พบบ่อยมากคำตอบนี้จึงมาจากบทความที่ฉันเขียนในบล็อกของฉัน
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
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับหัวข้อนี้โปรดอ่านบทความนี้เช่นกัน