Was ist der Unterschied zwischen @JoinColumn und mappedBy bei Verwendung einer JPA @ OneToMany-Verknüpfung?
Was ist der Unterschied zwischen:
@Entity
public class Company {
@OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
@JoinColumn(name = "companyIdRef", referencedColumnName = "companyId")
private List<Branch> branches;
...
}
und
@Entity
public class Company {
@OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY, mappedBy = "companyIdRef")
private List<Branch> branches;
...
}
InformationsquelleAutor der Frage Mykhaylo Adamovych | 2012-08-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Annotation
@JoinColumn
zeigt an, dass diese Einheit ist der Besitzer der Beziehung (sprich: die entsprechende Tabelle hat eine Spalte mit einem Fremdschlüssel auf die referenzierte Tabelle), während das AttributmappedBy
zeigt an, dass die Entität in dieser Seite ist die umkehrfunktion der Beziehung, und der Besitzer wohnt in der "anderen" Person. Dies bedeutet auch, dass Sie Zugriff auf die andere Tabelle aus der Klasse, die hast du kommentiert mit "mappedBy" (vollständig bidirektionale Beziehung).Insbesondere für den code in der Frage der korrekten Anmerkungen würde wie folgt Aussehen:
InformationsquelleAutor der Antwort Óscar López
@JoinColumn
könnte verwendet werden, auf beiden Seiten der Beziehung. Die Frage wurde über die Verwendung@JoinColumn
auf die@OneToMany
Seite (seltener Fall). Und der Punkt ist hier in physische Vervielfältigung von Informationen (Spalte name) zusammen mit nicht optimierten SQL-Abfrage zu erzeugen einige zusätzliche UPDATE-Anweisungen.Laut Dokumentation:
Seit viele sind (fast) immer Besitzer Seite eine bidirektionale Beziehung in der JPA-Spezifikation, die eins-zu-viele-Assoziation wird kommentiert von @OneToMany(mappedBy=...)
Truppe hat eine bidirektionale eins-zu-viele-Beziehung mit Soldaten durch die Truppe Eigenschaft. Sie müssen nicht (dürfen nicht) definieren Sie die physikalische Kartierung in der mappedBy-Seite.
Map eine bidirektionale eins-zu-viele, mit der eins-zu-viele-Seite der besitzenden Seitemüssen Sie die mappedBy-element, und legen Sie die viele zu einer @JoinColumn als einsetzbar und aktualisierbar auf false. Diese Lösung ist nicht optimiert und produzieren einige zusätzliche UPDATE-Anweisungen.
InformationsquelleAutor der Antwort Mykhaylo Adamovych
Annotation mappedBy idealerweise sollte immer verwendet werden, in der Übergeordneten Seite (Unternehmens-Klasse) der bi-direktionale Beziehung, in diesem Fall sollte es in der Gesellschaft Klassen zeigen auf die member-variable "Firma" von der Kind-Klasse (Zweig Klasse)
Annotation @JoinColumn wird verwendet, um anzugeben, eine zugeordnete Spalte für den Beitritt zu einer Einheit Verband, diese Anmerkung kann verwendet werden in jeder Klasse (Elternteil oder Kind), sondern es sollte idealerweise verwendet werden, die nur in einer Seite (entweder in der übergeordneten Klasse oder Untergeordnete Klasse nicht in beiden) hier in diesem Fall habe ich es in der Untergeordneten Seite (Zweig-Klasse) der bi-direktionale Beziehung, die angibt, die den Fremdschlüssel in der Filiale Klasse.
unten ist das Beispiel :
übergeordneten Klasse , Unternehmen
Kind-Klasse, Zweig
InformationsquelleAutor der Antwort Soumyaansh
Ich möchte nur hinzufügen, dass
@JoinColumn
müssen nicht immer mit dem physikalische Informationen Ort als diese Antwort vorschlägt. Sie können kombinieren@JoinColumn
mit@OneToMany
selbst wenn die übergeordnete Tabelle hat keine Daten zur Tabelle verweist auf die Kind-Tabelle.Wie definieren unidirektionale OneToMany-Beziehung in JPA
Unidirektionale OneToMany, Keine Inverse ManyToOne, Keine Join-Tabelle
Scheint es nur in
JPA 2.x+
obwohl. Es ist nützlich für Situationen, wo Sie wollen, dass die Kind-Klasse, nur enthält die ID des übergeordneten, nicht eine vollständige Referenz.InformationsquelleAutor der Antwort Snekse
Als ich erklärte, in dieser Artikelwenn Sie die
@OneToMany
annotation mit@JoinColumn
dann haben Sie eine unidirektionale Assoziation.Wenn Sie die
@OneToMany
mit dermappedBy
- Attribut gesetzt ist, müssen Sie eine bidirektionale Assoziation, das heißt, Sie brauchen, um eine@ManyToOne
Verein auf die untergeordnete Seite, die diemappedBy
Referenzen.Den unidirektional
@OneToMany
Verein nicht durchführen sehr gutso sollten Sie es vermeiden.Sind Sie besser dran mit der bidirektionale
@OneToMany
welche effizienter ist.InformationsquelleAutor der Antwort Vlad Mihalcea