Da diese Frage sehr häufig ist, basiert diese Antwort auf diesem Artikel, den ich in meinem Blog geschrieben habe.
CascadeType.REMOVE
Die CascadeType.REMOVE
Strategie, 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.ALL
Strategie:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
Mit dieser Option können Sie den remove
Vorgang von der übergeordneten Entität auf die untergeordneten Entitäten übertragen.
Wenn wir also die übergeordnete Post
Entität zusammen mit ihrer comments
Sammlung abrufen und die post
Entitä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 PostComment
untergeordneten Entitäten wurden aufgrund der CascadeType.REMOVE
Strategie 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 orphanRemoval
Attribut 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 Post
Entität zusammen mit ihrer comments
Sammlung laden und die erste PostComment
aus der comments
Sammlung 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_comment
Tabellenzeile aus:
DELETE FROM post_comment
WHERE id = 2
Weitere Informationen zu diesem Thema finden Sie auch in diesem Artikel .