Im Beispielabschnitt der @OneToMany
JPA-Anmerkungsreferenz :
Beispiel 1-59 @OneToMany - Kundenklasse mit Generika
@Entity
public class Customer implements Serializable {
...
@OneToMany(cascade=ALL, mappedBy="customer")
public Set<Order> getOrders() {
return orders;
}
...
}
Beispiel 1-60 @ManyToOne - Bestellklasse mit Generika
@Entity
public class Order implements Serializable {
...
@ManyToOne
@JoinColumn(name="CUST_ID", nullable=false)
public Customer getCustomer() {
return customer;
}
...
}
Es scheint mir, dass das Customer
Unternehmen der Eigentümer des Vereins ist. In der Erläuterung des mappedBy
Attributs im selben Dokument heißt es jedoch:
Wenn die Beziehung bidirektional ist, setzen Sie das Element mappedBy auf der inversen (nicht besitzenden) Seite der Zuordnung auf den Namen des Felds oder der Eigenschaft, der die Beziehung gehört, wie in Beispiel 1-60 gezeigt.
Wenn ich mich jedoch nicht irre, sieht es so aus, als ob im Beispiel das mappedBy
tatsächlich auf der Besitzerseite der Assoziation und nicht auf der Nichtbesitzerseite angegeben ist.
Meine Frage lautet also im Grunde:
Welche der Entitäten ist in einer bidirektionalen (Eins-zu-Viele / Viele-zu-Eins) Vereinigung der Eigentümer? Wie können wir die Eine Seite als Eigentümer bestimmen? Wie können wir die Many-Seite als Eigentümer bestimmen?
Was ist mit "der umgekehrten Seite der Assoziation" gemeint? Wie können wir die Eine Seite als die Umkehrung bezeichnen? Wie können wir die Viele-Seite als die Umkehrung bezeichnen?
Antworten:
Um dies zu verstehen, müssen Sie einen Schritt zurücktreten. In OO besitzt der Kunde die Bestellungen (Bestellungen sind eine Liste im Kundenobjekt). Ohne Kunden kann es keine Bestellung geben. Der Kunde scheint also der Eigentümer der Bestellungen zu sein.
In der SQL-Welt enthält ein Element jedoch tatsächlich einen Zeiger auf das andere. Da es für N Bestellungen 1 Kunden gibt, enthält jede Bestellung einen Fremdschlüssel für den Kunden, zu dem sie gehört. Dies ist die "Verbindung" und dies bedeutet, dass die Bestellung die Verbindung (Informationen) "besitzt" (oder buchstäblich enthält). Dies ist genau das Gegenteil von der OO / Modellwelt.
Dies kann helfen zu verstehen:
Die umgekehrte Seite ist der OO "Eigentümer" des Objekts, in diesem Fall der Kunde. Der Kunde hat keine Spalten in der Tabelle, in denen die Bestellungen gespeichert werden können. Sie müssen daher angeben, wo in der Auftragstabelle diese Daten gespeichert werden können (was über geschieht
mappedBy
).Ein weiteres häufiges Beispiel sind Bäume mit Knoten, die sowohl Eltern als auch Kinder sein können. In diesem Fall werden die beiden Felder in einer Klasse verwendet:
Dies erklärt für die "Fremdschlüssel" viele-zu-eins-Entwurfsarbeiten. Es gibt einen zweiten Ansatz, bei dem eine andere Tabelle verwendet wird, um die Beziehungen aufrechtzuerhalten. In unserem ersten Beispiel haben Sie also drei Tabellen: die mit Kunden, die mit Bestellungen und eine zweispaltige Tabelle mit Primärschlüsselpaaren (customerPK, orderPK).
Dieser Ansatz ist flexibler als der oben beschriebene (er kann problemlos eins zu eins, viele zu eins, eins zu viele und sogar viele zu viele verarbeiten). Der Preis ist das
Deshalb empfehle ich diesen Ansatz selten.
quelle
@Parent
oder eine@Child
Anmerkung anstelle von "XtoY" bevorzugen, um anzugeben, was die Verbindung bedeutet (anstatt wie sie implementiert wird )Unglaublicherweise hat in 3 Jahren niemand Ihre ausgezeichnete Frage mit Beispielen für beide Arten der Abbildung der Beziehung beantwortet.
Wie von anderen erwähnt, enthält die "Eigentümer" -Seite den Zeiger (Fremdschlüssel) in der Datenbank. Sie können jede Seite als Eigentümer festlegen. Wenn Sie jedoch die eine Seite als Eigentümer festlegen, ist die Beziehung nicht bidirektional (die inverse, auch als "viele" bezeichnete Seite hat keine Kenntnis von ihrem "Eigentümer"). Dies kann für die Einkapselung / lose Kopplung wünschenswert sein:
Die einzige bidirektionale Mapping-Lösung besteht darin, dass die Seite "Viele" ihren Zeiger auf die "Eins" besitzt und das Attribut "mappedBy" von @OneToMany verwendet. Ohne das Attribut "mappedBy" erwartet Hibernate eine doppelte Zuordnung (die Datenbank würde sowohl die Join-Spalte als auch die Join-Tabelle enthalten, was redundant ist (normalerweise unerwünscht)).
quelle
Die Entität, die die Tabelle mit dem Fremdschlüssel in der Datenbank enthält, ist die besitzende Entität, und die andere Tabelle, auf die verwiesen wird, ist die inverse Entität.
quelle
Einfache Regeln für bidirektionale Beziehungen:
1.Für viele bidirektionale Beziehungen von vielen zu eins ist die viele Seite immer die besitzende Seite der Beziehung. Beispiel: 1 Raum hat viele Personen (eine Person gehört nur einem Raum) -> Besitzerseite ist Person
2. Bei bidirektionalen Eins-zu-Eins-Beziehungen entspricht die besitzende Seite der Seite, die den entsprechenden Fremdschlüssel enthält.
3.Für viele zu viele bidirektionale Beziehungen kann jede Seite die besitzende Seite sein.
Hoffnung kann dir helfen.
quelle
Für zwei Entitätsklassen Kunde und Auftrag erstellt der Ruhezustand zwei Tabellen.
Mögliche Fälle:
mappedBy wird in den Klassen Customer.java und Order.java then-> nicht verwendet
Auf Kundenseite wird eine neue Tabelle [name = CUSTOMER_ORDER] erstellt, die die Zuordnung von CUSTOMER_ID und ORDER_ID beibehält. Dies sind Primärschlüssel von Kunden- und Auftragstabellen. Auf der Auftragsseite ist eine zusätzliche Spalte erforderlich, um die entsprechende Customer_ID-Datensatzzuordnung zu speichern.
mappedBy wird in Customer.java verwendet [Wie in der Problembeschreibung angegeben]. Jetzt wird keine zusätzliche Tabelle [CUSTOMER_ORDER] erstellt. Nur eine Spalte in der Auftragstabelle
mappedby wird in Order.java verwendet. Jetzt wird eine zusätzliche Tabelle im Ruhezustand erstellt. [name = CUSTOMER_ORDER] Die Order Table enthält keine zusätzliche Spalte [Customer_ID] für die Zuordnung.
Jede Seite kann zum Eigentümer der Beziehung gemacht werden. Aber es ist besser, xxxToOne Seite zu wählen.
Codierungseffekt -> Nur die Besitzerseite der Entität kann den Beziehungsstatus ändern. Im folgenden Beispiel ist die BoyFriend-Klasse Eigentümer der Beziehung. Selbst wenn Freundin sich trennen will, kann sie nicht.
quelle
Tabellenbeziehungen vs. Entitätsbeziehungen
In einem relationalen Datenbanksystem kann es nur drei Arten von Tabellenbeziehungen geben:
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 diecomments
Sammlung:In der
PostComment
wird diepost
Zuordnung wie folgt zugeordnet:Sie haben also zwei Seiten, die die Entitätszuordnung ändern können:
comments
untergeordneten Auflistungpost_comment
sollte der übergeordnetenpost
Entität über ihre eine neue Zeile zugeordnet werdenpost_id
Spalte .post
Eigenschaft derPostComment
Entität sollte auch diepost_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).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:
Die Methoden
addComment
und stellenremoveComment
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.quelle