Unidirektionale Eins-zu-Viel-Zuordnung
Wenn Sie die @OneToMany
Vermerk mit @JoinColumn
dann haben Sie eine unidirektionale Assoziation, wie die zwischen dem Elternteil Post
Entität und das Kind PostComment
in der folgenden Abbildung:
![Unidirectional one-to-many association]()
Bei einer unidirektionalen one-to-many Assoziation wird die Assoziation nur von der übergeordneten Seite zugeordnet.
In diesem Beispiel wird nur die Post
Entität definiert eine @OneToMany
Verbindung zum Kind PostComment
Einheit:
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "post_id")
private List<PostComment> comments = new ArrayList<>();
Bidirektionale Eins-zu-Viel-Verknüpfung
Wenn Sie die @OneToMany
mit dem mappedBy
Attribut gesetzt ist, haben Sie eine bidirektionale Assoziation. In unserem Fall sind sowohl die Post
Entität hat eine Sammlung von PostComment
Kind-Entitäten, und das Kind PostComment
Entität hat einen Verweis zurück auf die übergeordnete Post
wie das folgende Diagramm zeigt:
![Bidirectional one-to-many association]()
In der PostComment
Einheit, die post
wird die Entitätseigenschaft wie folgt abgebildet:
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
Der Grund, warum wir explizit die fetch
Attribut zu FetchType.LAZY
ist, weil standardmäßig alle @ManyToOne
y @OneToOne
Assoziationen werden eifrig abgerufen, was zu N+1-Abfrageproblemen führen kann.
In der Post
Einheit, die comments
Assoziation wird wie folgt abgebildet:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
En mappedBy
Attribut des @OneToMany
Anmerkung verweist auf die post
Eigenschaft im Kind PostComment
Entität, und auf diese Weise weiß Hibernate, dass die bidirektionale Assoziation von der @ManyToOne
Seite, die für die Verwaltung des Wertes der Fremdschlüsselspalte zuständig ist, auf dem diese Tabellenbeziehung basiert.
Für eine bidirektionale Assoziation benötigen Sie außerdem zwei Hilfsmethoden, wie addChild
y 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 Assoziation synchronisiert sind. Ohne die Synchronisierung beider Seiten garantiert Hibernate nicht, dass Änderungen des Assoziationsstatus an die Datenbank weitergegeben werden.
Welches soll man wählen?
Die unidirektionale @OneToMany
Die Assoziation ist nicht sehr leistungsfähig, daher sollten Sie sie vermeiden.
Besser ist es, die bidirektionale @OneToMany
was effizienter ist.