Ponieważ to pytanie jest bardzo częste, odpowiedź opiera się na tym artykule, który napisałem na swoim blogu.
CascadeType.REMOVE
CascadeType.REMOVE
Strategii, które można skonfigurować wyraźnie:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
lub odziedzicz to niejawnie ze CascadeType.ALL
strategii:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
umożliwia propagowanie remove
operacji z jednostki nadrzędnej do jej jednostek podrzędnych.
Jeśli więc pobierzemy Post
jednostkę nadrzędną wraz z jej comments
kolekcją i usuniemy post
jednostkę:
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 wykona trzy instrukcje usuwania:
DELETE FROM post_comment
WHERE id = 2
DELETE FROM post_comment
WHERE id = 3
DELETE FROM post
WHERE id = 1
Jednostki PostComment
podrzędne zostały usunięte z powodu CascadeType.REMOVE
strategii, która działała tak, jakbyśmy usunęli również jednostki podrzędne.
Strategia usuwania sierot
Strategia usuwania sierot, którą należy ustawić za pomocą orphanRemoval
atrybutu:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
umożliwia usunięcie wiersza tabeli podrzędnej po usunięciu elementu podrzędnego z kolekcji.
Jeśli więc załadujemy Post
jednostkę wraz z jej comments
kolekcją i usuniemy pierwszą PostComment
z comments
kolekcji:
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 ma zamiar wykonać instrukcję DELETE dla powiązanego post_comment
wiersza tabeli:
DELETE FROM post_comment
WHERE id = 2
Aby uzyskać więcej informacji na ten temat, zapoznaj się również z tym artykułem .