Was genau bedeutet die besitzende Seite ? Was ist eine Erklärung mit einigen Mapping-Beispielen ( eins zu viele, eins zu eins, viele zu eins )?
Der folgende Text ist ein Auszug aus der Beschreibung von @OneToOne in der Java EE 6-Dokumentation. Sie können die Seite sehen, die das Konzept besitzt .
Definiert eine einwertige Zuordnung zu einer anderen Entität mit einer Eins-zu-Eins-Multiplizität. Es ist normalerweise nicht erforderlich, die zugeordnete Zielentität explizit anzugeben, da sie normalerweise aus dem Typ des Objekts abgeleitet werden kann, auf das verwiesen wird. Wenn die Beziehung bidirektional ist, muss die nicht besitzende Seite das Element mappedBy der OneToOne-Annotation verwenden, um das Beziehungsfeld oder die Eigenschaft der besitzenden Seite anzugeben.
Antworten:
Warum ist die Vorstellung einer Besitzerseite notwendig:
Die Idee einer Besitzerseite einer bidirektionalen Beziehung beruht auf der Tatsache, dass es in relationalen Datenbanken keine bidirektionalen Beziehungen wie bei Objekten gibt. In Datenbanken haben wir nur unidirektionale Beziehungen - Fremdschlüssel.
Was ist der Grund für den Namen "Besitzerseite"?
Die Besitzerseite der von Hibernate verfolgten Beziehung ist die Seite der Beziehung, die den Fremdschlüssel in der Datenbank besitzt.
Was ist das Problem, das der Begriff des Besitzes einer Seite löst?
Nehmen Sie ein Beispiel für zwei zugeordnete Entitäten, ohne eine Besitzerseite zu deklarieren:
Aus OO-Sicht definiert diese Abbildung nicht eine bidirektionale Beziehung, sondern zwei separate unidirektionale Beziehungen.
Die Zuordnung schaffen würde nicht nur Tabellen
PERSONS
undID_DOCUMENTS
, sondern auch eine dritte Zuordnungstabelle erstellenPERSONS_ID_DOCUMENTS
:Beachten Sie die Primärschlüssel
pk
aufID_DOCUMENTS
nur. In diesem Fall verfolgt der Ruhezustand beide Seiten der Beziehung unabhängig voneinander: Wenn Sie der Beziehung ein Dokument hinzufügenPerson.idDocuments
, wird ein Datensatz in die Zuordnungstabelle eingefügtPERSON_ID_DOCUMENTS
.Wenn wir dagegen aufrufen
idDocument.setPerson(person)
, ändern wir den Fremdschlüssel person_id in der TabelleID_DOCUMENTS
. Hibernate erstellt zwei unidirektionale (Fremdschlüssel-) Beziehungen in der Datenbank, um eine bidirektionale Objektbeziehung zu implementieren .Wie der Gedanke, eine Seite zu besitzen, das Problem löst:
Viele Male , was wir wollen , ist nur ein Fremdschlüssel auf dem Tisch
ID_DOCUMENTS
hinPERSONS
und die zusätzliche Zuordnungstabelle.Um dies zu lösen, müssen wir den Ruhezustand so konfigurieren, dass die Änderungen an der Beziehung nicht mehr verfolgt werden
Person.idDocuments
. Der Ruhezustand sollte nur die andere Seite der Beziehung verfolgen. DazuIdDocument.person
fügen wir mappedBy hinzu :Was bedeutet mappedBy?
Gibt es irgendwelche GOTCHAs, Konsequenzen?
Mit mappedBy , wenn wir nur anrufen
person.getDocuments().add(document)
, die Fremdschlüssel inID_DOCUMENTS
wird nicht in dem neuen Dokument verknüpft werden, denn dies ist nicht der besitz / nachverfolgt Seite der Beziehung ist!Um das Dokument mit der neuen Person zu verknüpfen, müssen Sie explizit anrufen
document.setPerson(person)
, da dies die besitzende Seite der Beziehung ist.Bei Verwendung von mappedBy liegt es in der Verantwortung des Entwicklers, die Eigentümerseite zu kennen und die richtige Seite der Beziehung zu aktualisieren, um die Persistenz der neuen Beziehung in der Datenbank auszulösen.
quelle
person.getDocuments().add(document)
, aktualisiert der Ruhezustand den FremdschlüsselID_DOCUMENTS
.@OneToMany
Annotationen, das auf PERSIST gesetzt werden kann. In diesem Fall speichert der Ruhezustand alle verknüpften Entitäten in der Datenbank. Kann jemand dies bitte klarstellen - warum sagt der Autor, dass der Ruhezustand keine Änderungen auf der Seite des Nichtbesitzers verfolgt -, aber tatsächlich führt der Ruhezustand eine Nachverfolgung durch?Sie können sich vorstellen, dass die besitzende Seite die Entität ist, die den Verweis auf die andere hat. In Ihrem Auszug haben Sie eine Eins-zu-Eins-Beziehung. Da ist es ein symmetrische Beziehung handelt, haben Sie am Ende das Gegenteil, wenn Objekt A in Beziehung zu Objekt B steht.
Dies bedeutet, dass das Speichern eines Verweises auf Objekt B in Objekt A und das Speichern eines Verweises auf Objekt A in Objekt B redundant ist. Deshalb wählen Sie, welches Objekt das andere Objekt "besitzt", das den Verweis darauf hat.
Wenn Sie eine Eins-zu-Viele-Beziehung haben, sind die Objekte, die sich auf den Teil "Viele" beziehen, die besitzende Seite, andernfalls müssten Sie viele Referenzen von einem einzelnen Objekt zu einer Vielzahl speichern. Um dies zu vermeiden, hat jedes Objekt in der zweiten Klasse einen Zeiger auf das einzelne Objekt, auf das es verweist (also sind sie die besitzende Seite).
Für eine Viele-zu-Viele-Beziehung gibt es keine eigene Seite, da Sie ohnehin eine separate Zuordnungstabelle benötigen.
Zusammenfassend ist die besitzende Seite die Entität, die den Bezug zur anderen hat.
quelle
@ManyToMany
Beziehungen haben auch Besitzerseiten. In ähnlicher Weise können@OneToMany
Beziehungen Verknüpfungstabellen verwenden, und Sie müssen immer noch eine Besitzerseite angeben.