Vì câu hỏi này rất phổ biến, câu trả lời này dựa trên bài viết này tôi đã viết trên blog của mình.
CascadeType.REMOVE
Các CascadeType.REMOVEchiến lược, mà bạn có thể cấu hình một cách rõ ràng:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
hoặc kế thừa nó ngầm từ CascadeType.ALLchiến lược:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
cho phép bạn truyền removehoạt động từ thực thể mẹ sang các thực thể con của nó.
Vì vậy, nếu chúng tôi tìm nạp Postthực thể mẹ cùng với commentsbộ sưu tập của nó và xóa postthực thể:
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);
Hibernate sẽ thực thi ba câu lệnh xóa:
DELETE FROM post_comment
WHERE id = 2
DELETE FROM post_comment
WHERE id = 3
DELETE FROM post
WHERE id = 1
Các PostCommentthực thể con đã bị xóa do CascadeType.REMOVEchiến lược này hoạt động như thể chúng tôi cũng xóa các thực thể con.
Chiến lược loại bỏ trẻ mồ côi
Chiến lược loại bỏ trẻ mồ côi, cần được đặt thông qua orphanRemovalthuộc tính:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
cho phép bạn xóa hàng bảng con khi xóa thực thể con khỏi bộ sưu tập.
Vì vậy, nếu chúng tôi tải Postđối tượng cùng với commentsbộ sưu tập của nó và xóa đối tượng đầu tiên PostCommentkhỏi commentsbộ sưu tập:
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));
Hibernate sẽ thực thi một câu lệnh DELETE cho post_commenthàng bảng được liên kết :
DELETE FROM post_comment
WHERE id = 2
Để biết thêm chi tiết về chủ đề này, hãy xem bài viết này .