Tabellenbeziehungen vs. Entitätsbeziehungen
In einem relationalen Datenbanksystem kann es nur drei Arten von Tabellenbeziehungen geben:
- Eins-zu-Viele (über eine Fremdschlüsselspalte)
- eins zu eins (über einen gemeinsamen Primärschlüssel)
- Viele-zu-Viele (über eine Verknüpfungstabelle mit zwei Fremdschlüsseln, die auf zwei separate übergeordnete Tabellen verweisen)
Eine one-to-manyTabellenbeziehung sieht also wie folgt aus:

Beachten Sie, dass die Beziehung auf der Spalte Fremdschlüssel (z. B. post_id) in der untergeordneten Tabelle basiert .
Es gibt also eine einzige Quelle der Wahrheit, wenn es darum geht, eine one-to-manyTabellenbeziehung zu verwalten.
Wenn Sie nun eine bidirektionale Entitätsbeziehung verwenden, die der one-to-manyzuvor gesehenen Tabellenbeziehung zugeordnet ist:

Wenn Sie sich das obige Diagramm ansehen, sehen Sie, dass es zwei Möglichkeiten gibt, diese Beziehung zu verwalten.
In der PostEntität haben Sie die commentsSammlung:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
In der PostCommentwird die postZuordnung wie folgt zugeordnet:
@ManyToOne(
fetch = FetchType.LAZY
)
@JoinColumn(name = "post_id")
private Post post;
Sie haben also zwei Seiten, die die Entitätszuordnung ändern können:
- Durch Hinzufügen eines Eintrags in der
commentsuntergeordneten Auflistung post_commentsollte der übergeordneten postEntität über ihre eine neue Zeile zugeordnet werdenpost_id Spalte .
- Durch Festlegen der
postEigenschaft der PostCommentEntität sollte auch die post_idSpalte aktualisiert werden.
Da es zwei Möglichkeiten gibt, die Fremdschlüsselspalte darzustellen, müssen Sie definieren, welche Quelle die Wahrheit ist, wenn es darum geht, die Zuordnungsstatusänderung in die entsprechende Änderung des Fremdschlüsselspaltenwerts zu übersetzen.
MappedBy (auch bekannt als die inverse Seite)
Das mappedByAttribut gibt an, dass die @ManyToOneSeite für die Verwaltung der Fremdschlüsselspalte verantwortlich ist. Die Auflistung wird nur zum Abrufen der untergeordneten Entitäten und zum Kaskadieren von Statusänderungen der übergeordneten Entität an untergeordnete Entitäten verwendet (z. B. sollte durch Entfernen der übergeordneten Entitäten auch die untergeordneten Entitäten entfernt werden).
Es wird als inverse Seite bezeichnet, da es auf die untergeordnete Entitätseigenschaft verweist, die diese Tabellenbeziehung verwaltet.
Synchronisieren Sie beide Seiten einer bidirektionalen Zuordnung
Selbst wenn Sie das mappedByAttribut definiert haben und die untergeordnete @ManyToOneZuordnung die Spalte Fremdschlüssel verwaltet, müssen Sie jetzt beide Seiten der bidirektionalen Zuordnung synchronisieren.
Der beste Weg, dies zu tun, besteht darin, diese beiden Dienstprogrammmethoden hinzuzufügen:
public void addComment(PostComment comment) {
comments.add(comment);
comment.setPost(this);
}
public void removeComment(PostComment comment) {
comments.remove(comment);
comment.setPost(null);
}
Die Methoden addCommentund stellen removeCommentsicher, dass beide Seiten synchronisiert sind. Wenn wir also eine untergeordnete Entität hinzufügen, muss die untergeordnete Entität auf die übergeordnete Entität verweisen, und die übergeordnete Entität sollte das untergeordnete Element in der untergeordneten Sammlung enthalten.
Weitere Informationen zum besten Synchronisieren aller bidirektionalen Entitätszuordnungstypen finden Sie in diesem Artikel .