Karena pertanyaan ini sangat umum, jawaban ini didasarkan pada artikel yang saya tulis di blog saya ini.
CascadeType.REMOVE
The CascadeType.REMOVEstrategi, yang Anda dapat mengkonfigurasi secara eksplisit:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
atau mewarisi secara implisit dari CascadeType.ALLstrategi:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
memungkinkan Anda untuk menyebarkan remove operasi dari entitas induk ke entitas anaknya.
Jadi, jika kita mengambil Postentitas induk beserta commentskoleksinya, dan menghapus postentitas tersebut:
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 akan menjalankan tiga pernyataan hapus:
DELETE FROM post_comment
WHERE id = 2
DELETE FROM post_comment
WHERE id = 3
DELETE FROM post
WHERE id = 1
Para PostCommententitas anak yang dihapus karenaCascadeType.REMOVE strategi, yang bertindak seolah-olah kita dihapus entitas anak juga.
Strategi pemindahan anak yatim piatu
Strategi penghapusan yatim piatu, yang perlu disetel melalui orphanRemovalatribut:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
memungkinkan Anda untuk menghapus baris tabel anak setelah menghapus entitas anak dari koleksi.
Jadi, jika kita memuat Postentitas bersama dengan commentskoleksinya dan menghapus yang pertama PostCommentdari commentskoleksi:
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 akan menjalankan pernyataan DELETE untuk post_commentbaris tabel terkait :
DELETE FROM post_comment
WHERE id = 2
Untuk detail lebih lanjut tentang topik ini, lihat artikel ini juga.