Poiché questa domanda è molto comune, questa risposta si basa su questo articolo che ho scritto sul mio blog.
CascadeType.REMOVE
La CascadeType.REMOVEstrategia, che puoi configurare esplicitamente:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
o ereditarlo implicitamente dalla CascadeType.ALLstrategia:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
consente di propagare l' removeoperazione dall'entità padre alle sue entità figlio.
Quindi, se recuperiamo l' Postentità genitore insieme alla sua commentsraccolta e rimuoviamo l' postentità:
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 eseguirà tre istruzioni di cancellazione:
DELETE FROM post_comment
WHERE id = 2
DELETE FROM post_comment
WHERE id = 3
DELETE FROM post
WHERE id = 1
Le PostCommententità figlio sono state eliminate a causa della CascadeType.REMOVEstrategia, che si comportava come se avessimo rimosso anche le entità figlio.
La strategia di rimozione degli orfani
La strategia di rimozione degli orfani, che deve essere impostata tramite l' orphanRemovalattributo:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
ti consente di rimuovere la riga della tabella figlia dopo aver rimosso l'entità figlio dalla raccolta.
Quindi, se carichiamo l' Postentità insieme alla sua commentsraccolta e rimuoviamo la prima PostCommentdalla commentsraccolta:
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 eseguirà un'istruzione DELETE per la post_commentriga della tabella associata :
DELETE FROM post_comment
WHERE id = 2
Per maggiori dettagli su questo argomento, consulta anche questo articolo .