Ponieważ jest to bardzo częste pytanie, napisałem ten artykuł , na którym opiera się ta odpowiedź.
Przejścia stanu encji
JPA tłumaczy przejścia stanu encji na instrukcje SQL, takie jak INSERT, UPDATE lub DELETE.

Kiedy jesteś persistbytem, planujesz wykonanie instrukcji INSERT po jej EntityManageropróżnieniu, automatycznie lub ręcznie.
gdy jesteś removebytem, planujesz instrukcję DELETE, która zostanie wykonana po opróżnieniu kontekstu trwałości.
Kaskadowe przejścia stanu encji
Dla wygody JPA pozwala propagować przejścia stanu encji z encji nadrzędnych na encje podrzędne.
Jeśli więc masz Postjednostkę nadrzędną , która jest @OneToManypowiązana z PostCommentjednostką podrzędną:

commentsKolekcja w Postjednostce są odwzorowywane w sposób następujący:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Comment> comments = new ArrayList<>();
CascadeType.ALL
Ten cascadeatrybut informuje dostawcę JPA, aby przekazał przejście stanu encji z Postencji nadrzędnej do wszystkich PostCommentencji zawartych w plikucomments kolekcji.
Jeśli więc usuniesz Postjednostkę:
Post post = entityManager.find(Post.class, 1L);
assertEquals(2, post.getComments().size());
entityManager.remove(post);
Dostawca JPA PostCommentnajpierw usunie encję, a kiedy wszystkie encje podrzędne zostaną usunięte, usunie również Postencję:
DELETE FROM post_comment WHERE id = 1
DELETE FROM post_comment WHERE id = 2
DELETE FROM post WHERE id = 1
Usunięcie sieroty
Po ustawieniu orphanRemovalatrybutu truedostawca JPA planuje removeoperację, gdy jednostka potomna zostanie usunięta z kolekcji.
W naszym przypadku
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);
Dostawca JPA usunie powiązany post_commentrekord, ponieważ PostCommentjednostka nie jest już przywoływana w commentskolekcji:
DELETE FROM post_comment WHERE id = 1
PRZY USUNIĘCIU KASKADA
ON DELETE CASCADEJest określona na poziomie FK:
ALTER TABLE post_comment
ADD CONSTRAINT fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
ON DELETE CASCADE;
Gdy to zrobisz, jeśli usuniesz postwiersz:
DELETE FROM post WHERE id = 1
Wszystkie powiązane post_commentjednostki są automatycznie usuwane przez silnik bazy danych. Może to być jednak bardzo niebezpieczna operacja, jeśli przez pomyłkę usuniesz element główny.
Wniosek
Zaletą JPA cascadei orphanRemovalopcji jest to, że możesz również skorzystać z optymistycznego blokowania, aby zapobiec utracie aktualizacji .
Jeśli korzystasz z mechanizmu kaskadowego JPA, nie musisz używać poziomu DDL ON DELETE CASCADE, co może być bardzo niebezpieczną operacją, jeśli usuniesz element główny, który ma wiele elementów potomnych na wielu poziomach.
Więcej informacji na ten temat można znaleźć w tym artykule .