Bu çok yaygın bir soru olduğundan, bu cevabın dayandığı bu makaleyi yazdım .
Varlık durumu geçişleri
JPA, varlık durumu geçişlerini INSERT, UPDATE veya DELETE gibi SQL deyimlerine çevirir.

Bir persistvarlık olduğunda , INSERT deyimini EntityManagerotomatik olarak veya el ile temizlendiğinde yürütülecek şekilde zamanlarsınız .
Ne zaman removebir varlık, sen Sebat Bağlam sifonu çekildiğinde yürütülecektir DELETE deyimi, zamanlıyorsanız.
Basamaklı varlık devleti geçişleri
Kolaylık sağlamak için JPA, varlık durumu geçişlerini üst varlıklardan alt öğeye geçirmenize olanak tanır.
Dolayısıyla, alt varlık ile Postbir @OneToManyilişkisi olan bir ana öğeniz varsa PostComment:

Varlıktaki commentskoleksiyon Postaşağıdaki gibi eşlenir:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Comment> comments = new ArrayList<>();
CascadeType.ALL
cascadeNitelik ebeveyn gelen varlık hal geçişini geçmesine JPA sağlayıcı söyler Postherkese varlık PostCommentiçinde bulunan kişiler commentskoleksiyonunda.
Varlığı kaldırırsanız Post:
Post post = entityManager.find(Post.class, 1L);
assertEquals(2, post.getComments().size());
entityManager.remove(post);
JPA sağlayıcısı önce PostCommentvarlığı kaldıracak ve tüm alt varlıklar silindiğinde Postvarlığı da silecektir :
DELETE FROM post_comment WHERE id = 1
DELETE FROM post_comment WHERE id = 2
DELETE FROM post WHERE id = 1
Yetim kaldırma
orphanRemovalÖzelliği olarak ayarladığınızda, alt varlık koleksiyondan kaldırıldığında trueJPA sağlayıcı bir removeişlem zamanlayacaktır .
Yani, bizim durumumuzda,
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);
Varlık koleksiyonda artık referans gösterilmediğinden JPA sağlayıcısı ilişkili post_commentkaydı kaldıracak :PostCommentcomments
DELETE FROM post_comment WHERE id = 1
SİLİNDİR SİLME
ON DELETE CASCADEFK düzeyinde tanımlanır:
ALTER TABLE post_comment
ADD CONSTRAINT fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
ON DELETE CASCADE;
Bunu yaptıktan sonra bir postsatırı silerseniz :
DELETE FROM post WHERE id = 1
İlişkili tüm post_commentvarlıklar veritabanı motoru tarafından otomatik olarak kaldırılır. Ancak, yanlışlıkla bir kök varlığı silerseniz bu çok tehlikeli bir işlem olabilir.
Sonuç
JPA'nın cascadeve orphanRemovalseçeneklerin avantajı, kayıp güncellemeleri önlemek için iyimser kilitlemeden de yararlanabilmenizdir .
JPA basamaklı mekanizmayı kullanırsanız ON DELETE CASCADE, birden çok düzeyde çok sayıda alt öğe içeren bir kök varlığı kaldırırsanız çok tehlikeli bir işlem olabilecek DDL düzeyi kullanmanız gerekmez .
Bu konu hakkında daha fazla bilgi için bu makaleye göz atın .