Da dies eine sehr häufige Frage ist, habe ich
diesen Artikel geschrieben , auf dem diese Antwort basiert.
Unidirektionale Eins-zu-Viele-Assoziation
Wie ich in diesem Artikel erklärt habe , haben Sie, wenn Sie die @OneToManyAnnotation mit verwenden @JoinColumn, eine unidirektionale Zuordnung, wie die zwischen der übergeordneten PostEntität und dem untergeordneten Element PostCommentin der folgenden Abbildung:

Bei Verwendung einer unidirektionalen Eins-zu-Viele-Zuordnung ordnet nur die übergeordnete Seite die Zuordnung zu.
In diesem Beispiel Postdefiniert nur die Entität eine @OneToManyZuordnung zur untergeordneten PostCommentEntität:
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "post_id")
private List<PostComment> comments = new ArrayList<>();
Bidirektionale Eins-zu-Viele-Assoziation
Wenn Sie das @OneToManymit dem mappedByAttributsatz verwenden, haben Sie eine bidirektionale Zuordnung. In unserem Fall verfügt sowohl die PostEntität über eine Sammlung von PostCommentuntergeordneten Entitäten als auch die untergeordnete PostCommentEntität über einen Verweis auf die übergeordnete PostEntität, wie in der folgenden Abbildung dargestellt:

In der PostCommentEntität wird die postEntitätseigenschaft wie folgt zugeordnet:
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
Der Grund, warum wir das fetchAttribut explizit festlegen , FetchType.LAZYist, dass standardmäßig alle @ManyToOneund @OneToOneZuordnungen eifrig abgerufen werden, was zu N + 1-Abfrageproblemen führen kann. Weitere Informationen zu diesem Thema finden Sie in diesem Artikel .
In der PostEntität wird die commentsZuordnung wie folgt zugeordnet:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
Das mappedByAttribut der @OneToManyAnnotation verweist auf die postEigenschaft in der untergeordneten PostCommentEntität. Auf diese Weise weiß Hibernate, dass die bidirektionale Zuordnung von der @ManyToOneSeite gesteuert wird , die für die Verwaltung des Spaltenwerts für den Fremdschlüssel verantwortlich ist, auf dem diese Tabellenbeziehung basiert.
Für eine bidirektionale Zuordnung benötigen Sie außerdem zwei Dienstprogrammmethoden wie addChildund removeChild:
public void addComment(PostComment comment) {
comments.add(comment);
comment.setPost(this);
}
public void removeComment(PostComment comment) {
comments.remove(comment);
comment.setPost(null);
}
Diese beiden Methoden stellen sicher, dass beide Seiten der bidirektionalen Zuordnung nicht synchron sind. Ohne beide Enden zu synchronisieren, garantiert Hibernate nicht, dass Änderungen des Zuordnungsstatus in die Datenbank übertragen werden.
Weitere Informationen zum besten Wat zum Synchronisieren bidirektionaler Zuordnungen mit JPA und Hibernate finden Sie in diesem Artikel .
Welches soll ich wählen?
Die unidirektionale @OneToManyZuordnung funktioniert nicht sehr gut , daher sollten Sie sie vermeiden.
Sie sind besser dran, wenn Sie das bidirektionale verwenden, @OneToManydas effizienter ist .