Poiché questa domanda è molto comune, questa risposta si basa su questo articolo che ho scritto sul mio blog.
CascadeType.REMOVE
La CascadeType.REMOVE
strategia, che puoi configurare esplicitamente:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
o ereditarlo implicitamente dalla CascadeType.ALL
strategia:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
consente di propagare l' remove
operazione dall'entità padre alle sue entità figlio.
Quindi, se recuperiamo l' Post
entità genitore insieme alla sua comments
raccolta e rimuoviamo l' post
entità:
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 PostComment
entità figlio sono state eliminate a causa della CascadeType.REMOVE
strategia, 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' orphanRemoval
attributo:
@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' Post
entità insieme alla sua comments
raccolta e rimuoviamo la prima PostComment
dalla comments
raccolta:
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_comment
riga della tabella associata :
DELETE FROM post_comment
WHERE id = 2
Per maggiori dettagli su questo argomento, consulta anche questo articolo .