Karena pertanyaan ini sangat umum, jawaban ini didasarkan pada artikel yang saya tulis di blog saya ini.
CascadeType.REMOVE
The CascadeType.REMOVE
strategi, yang Anda dapat mengkonfigurasi secara eksplisit:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
atau mewarisi secara implisit dari CascadeType.ALL
strategi:
@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 Post
entitas induk beserta comments
koleksinya, dan menghapus post
entitas 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 PostComment
entitas 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 orphanRemoval
atribut:
@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 Post
entitas bersama dengan comments
koleksinya dan menghapus yang pertama PostComment
dari comments
koleksi:
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_comment
baris tabel terkait :
DELETE FROM post_comment
WHERE id = 2
Untuk detail lebih lanjut tentang topik ini, lihat artikel ini juga.