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.REMOVE
chiế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.ALL
chiến lược:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
cho phép bạn truyền remove
hoạ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 Post
thực thể mẹ cùng với comments
bộ sưu tập của nó và xóa post
thự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 PostComment
thực thể con đã bị xóa do CascadeType.REMOVE
chiế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 orphanRemoval
thuộ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 comments
bộ sưu tập của nó và xóa đối tượng đầu tiên PostComment
khỏi comments
bộ 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_comment
hà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 .