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-many
Tabellenbeziehung 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-many
Tabellenbeziehung zu verwalten.
Wenn Sie nun eine bidirektionale Entitätsbeziehung verwenden, die der one-to-many
zuvor 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 Post
Entität haben Sie die comments
Sammlung:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
In der PostComment
wird die post
Zuordnung 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
comments
untergeordneten Auflistung post_comment
sollte der übergeordneten post
Entität über ihre eine neue Zeile zugeordnet werdenpost_id
Spalte .
- Durch Festlegen der
post
Eigenschaft der PostComment
Entität sollte auch die post_id
Spalte 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 mappedBy
Attribut gibt an, dass die @ManyToOne
Seite 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 mappedBy
Attribut definiert haben und die untergeordnete @ManyToOne
Zuordnung 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 addComment
und stellen removeComment
sicher, 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 .