Karena ini adalah pertanyaan yang sangat umum, saya menulis artikel ini , yang menjadi dasar jawaban ini.
Transisi status entitas
JPA menerjemahkan transisi status entitas ke pernyataan SQL, seperti INSERT, UPDATE atau DELETE.

Ketika Anda persistsuatu entitas, Anda menjadwalkan pernyataan INSERT untuk dieksekusi ketika EntityManagermemerah, baik secara otomatis atau manual.
ketika Anda removesuatu entitas, Anda menjadwalkan pernyataan DELETE, yang akan dieksekusi ketika Konteks Persistence memerah.
Transisi status entitas Cascading
Untuk kenyamanan, JPA memungkinkan Anda untuk menyebarkan transisi status entitas dari entitas induk ke entitas anak.
Jadi, jika Anda memiliki Postentitas induk yang memiliki @OneToManykaitan dengan PostCommententitas anak:

The commentskoleksi dalam Postentitas dipetakan sebagai berikut:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Comment> comments = new ArrayList<>();
CascadeType.ALL
The cascadeatribut memberitahu penyedia JPA untuk lulus transisi entitas negara dari induk Postentitas untuk semua PostCommententitas yang terkandung dalam commentskoleksi.
Jadi, jika Anda menghapus Postentitas:
Post post = entityManager.find(Post.class, 1L);
assertEquals(2, post.getComments().size());
entityManager.remove(post);
Penyedia JPA akan menghapus PostCommententitas terlebih dahulu, dan ketika semua entitas anak dihapus, itu akan menghapus Postentitas juga:
DELETE FROM post_comment WHERE id = 1
DELETE FROM post_comment WHERE id = 2
DELETE FROM post WHERE id = 1
Penghapusan anak yatim
Ketika Anda mengatur orphanRemovalatribut true, penyedia JPA akan menjadwalkan removeoperasi ketika entitas anak dihapus dari koleksi.
Jadi, dalam kasus kami,
Post post = entityManager.find(Post.class, 1L);
assertEquals(2, post.getComments().size());
PostComment postComment = post.getComments().get(0);
assertEquals(1L, postComment.getId());
post.getComments().remove(postComment);
Penyedia JPA akan menghapus post_commentcatatan terkait karena PostCommententitas tidak lagi dirujuk dalam commentskoleksi:
DELETE FROM post_comment WHERE id = 1
HAPUS CASCADE
The ON DELETE CASCADEdidefinisikan di tingkat FK:
ALTER TABLE post_comment
ADD CONSTRAINT fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
ON DELETE CASCADE;
Setelah Anda melakukannya, jika Anda menghapus satu postbaris:
DELETE FROM post WHERE id = 1
Semua post_commententitas yang terkait dihapus secara otomatis oleh mesin database. Namun, ini bisa menjadi operasi yang sangat berbahaya jika Anda menghapus entitas root karena kesalahan.
Kesimpulan
Keuntungan dari JPA cascadedan orphanRemovalopsi adalah Anda juga dapat memanfaatkan penguncian optimis untuk mencegah pembaruan yang hilang .
Jika Anda menggunakan mekanisme cascading JPA, Anda tidak perlu menggunakan level DDL ON DELETE CASCADE, yang bisa menjadi operasi yang sangat berbahaya jika Anda menghapus entitas root yang memiliki banyak entitas anak di beberapa level.
Untuk detail lebih lanjut tentang topik ini, lihat artikel ini .