Da diese Frage sehr häufig ist, basiert diese Antwort auf diesem Artikel, den ich in meinem Blog geschrieben habe.
CascadeType.REMOVE
Die CascadeType.REMOVEStrategie, die Sie explizit konfigurieren können:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
oder erben Sie es implizit von der CascadeType.ALLStrategie:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
Mit dieser Option können Sie den removeVorgang von der übergeordneten Entität auf die untergeordneten Entitäten übertragen.
Wenn wir also die übergeordnete PostEntität zusammen mit ihrer commentsSammlung abrufen und die postEntität entfernen :
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 führt drei Löschanweisungen aus:
DELETE FROM post_comment
WHERE id = 2
DELETE FROM post_comment
WHERE id = 3
DELETE FROM post
WHERE id = 1
Die PostCommentuntergeordneten Entitäten wurden aufgrund der CascadeType.REMOVEStrategie gelöscht , die so tat, als hätten wir auch die untergeordneten Entitäten entfernt.
Die Strategie zur Entfernung von Waisen
Die Strategie zum Entfernen von Waisen, die über das orphanRemovalAttribut festgelegt werden muss:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
Mit dieser Option können Sie die untergeordnete Tabellenzeile entfernen, wenn Sie die untergeordnete Entität aus der Sammlung entfernen.
Wenn wir also die PostEntität zusammen mit ihrer commentsSammlung laden und die erste PostCommentaus der commentsSammlung entfernen :
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 führt eine DELETE-Anweisung für die zugehörige post_commentTabellenzeile aus:
DELETE FROM post_comment
WHERE id = 2
Weitere Informationen zu diesem Thema finden Sie auch in diesem Artikel .