Como esta es una pregunta muy común, escribí este artículo , en el que se basa esta respuesta.
Transiciones de estado de entidad
JPA traduce las transiciones de estado de la entidad a sentencias SQL, como INSERT, UPDATE o DELETE.

Cuando usted es persistuna entidad, está programando la instrucción INSERT para que se ejecute cuando EntityManagerse vacía, de forma automática o manual.
cuando eres removeuna entidad, estás programando la declaración DELETE, que se ejecutará cuando se vacíe el Contexto de persistencia.
Transiciones de estado de entidad en cascada
Por conveniencia, JPA le permite propagar las transiciones de estado de la entidad de las entidades principales a las secundarias.
Entonces, si tiene una Postentidad principal que tiene una @OneToManyasociación con la PostCommententidad secundaria:

La commentscolección en la Postentidad se asigna de la siguiente manera:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Comment> comments = new ArrayList<>();
CascadeType.ALL
El cascadeatributo le dice al proveedor de JPA que pase la transición del estado de la Postentidad de la entidad principal a todas las PostCommententidades contenidas en elcomments colección.
Entonces, si elimina la Postentidad:
Post post = entityManager.find(Post.class, 1L);
assertEquals(2, post.getComments().size());
entityManager.remove(post);
El proveedor de JPA eliminará PostCommentprimero la entidad, y cuando se eliminen todas las entidades secundarias, también eliminará la Postentidad:
DELETE FROM post_comment WHERE id = 1
DELETE FROM post_comment WHERE id = 2
DELETE FROM post WHERE id = 1
Retiro de huérfanos
Cuando establezca el orphanRemovalatributo en true, el proveedor de JPA programará una removeoperación cuando la entidad secundaria se elimine de la colección.
Entonces, en nuestro caso,
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);
El proveedor de JPA eliminará el post_commentregistro asociado ya que la PostCommententidad ya no está referenciada en la commentscolección:
DELETE FROM post_comment WHERE id = 1
EN ELIMINAR CASCADA
El ON DELETE CASCADEse define en el nivel FK:
ALTER TABLE post_comment
ADD CONSTRAINT fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
ON DELETE CASCADE;
Una vez que haga eso, si elimina una postfila:
DELETE FROM post WHERE id = 1
El post_commentmotor de la base de datos elimina automáticamente todas las entidades asociadas . Sin embargo, esta puede ser una operación muy peligrosa si elimina una entidad raíz por error.
Conclusión
La ventaja de JPA cascadey las orphanRemovalopciones es que también puede beneficiarse del bloqueo optimista para evitar actualizaciones perdidas .
Si usa el mecanismo de cascada JPA, no necesita usar el nivel DDL ON DELETE CASCADE, que puede ser una operación muy peligrosa si elimina una entidad raíz que tiene muchas entidades secundarias en varios niveles.
Para obtener más detalles sobre este tema, consulte este artículo .