Wenn wir an einer Hibernate-Anwendung arbeiten oder planen, in Zukunft an einer solchen zu arbeiten, dann können wir die One-to-One-Beziehungen zwischen mehreren Entitäten in der Anwendung leicht verstehen. In diesem Hibernate One-to-One-Mapping-Beispiel werden wir 4 verschiedene Varianten besprechen.
Table of ContentsVarious supported techniques for one to one mapping1. Using foreign key association2. Using join table3. Using shared primary key4. @MapsId
Für dieses Hibernate One-to-One-Mapping-Beispiel erweitere ich das Beispiel, das für das Hibernate Hello World-Beispiel geschrieben wurde. Wir haben hier zwei Entitäten: Employee
und Account
.
Ein Mitarbeiter kann nur ein Konto haben. Ebenso wird ein Konto nur mit einem Mitarbeiter verknüpft. In diesem Beispiel handelt es sich um eine Eins-zu-eins-Beziehung.
Verschiedene unterstützte Techniken
In Hibernate gibt es 3 Möglichkeiten, Eins-zu-eins-Beziehungen zwischen zwei Entitäten zu erstellen. In jedem Fall müssen wir die @OneToOne-Annotation verwenden.
- Die erste Technik ist am weitesten verbreitet und verwendet eine Fremdschlüsselspalte in einer der Tabellen.
- Die zweite Technik verwendet eine ziemlich bekannte Lösung, bei der eine dritte Tabelle verwendet wird, um die Zuordnung zwischen den ersten beiden Tabellen zu speichern.
- Die dritte Technik ist etwas Neues, bei der ein gemeinsamer Primärschlüsselwert in beiden Tabellen verwendet wird.
Hibernate One-to-One-Mapping mit Fremdschlüssel-Assoziation
Bei dieser Art von Assoziation wird eine Fremdschlüsselspalte in der Eigentümerentität erstellt. Wenn wir zum Beispiel EmployeeEntity zum Eigentümer machen, dann wird eine zusätzliche Spalte "ACCOUNT_ID"
in der Tabelle Employee
erstellt. Diese Spalte speichert den Fremdschlüssel für die Tabelle Account
.
Die Tabellenstruktur sieht wie folgt aus:
Um eine solche Verknüpfung herzustellen, verweisen Sie auf die Entität Account
in der Klasse EmployeeEntity
wie folgt:
@OneToOne@JoinColumn(name="ACCOUNT_ID")private AccountEntity account;
Die Verknüpfungsspalte wird mit der @JoinColumn-Annotation deklariert, die wie die @Column-Annotation aussieht. Sie hat einen weiteren Parameter namens referencedColumnName
. Dieser Parameter deklariert die Spalte in der Zielentität, die für den Join verwendet wird.
Wenn kein @JoinColumn
auf der Eigentümerseite deklariert ist, gelten die Standardwerte. Eine Join-Spalte(n) wird/werden in der Eigentümertabelle erstellt und ihr Name ist die Verkettung des Namens der Beziehung auf der Eigentümerseite, _ (Unterstrich), und des Namens der Primärschlüsselspalte(n) auf der Eigentümerseite.
In einer bidirektionalen Beziehung muss eine der Seiten (und nur eine) der Eigentümer sein. Der Eigentümer ist für die Aktualisierung der Assoziationsspalte(n) verantwortlich. Um eine Seite als nicht verantwortlich für die Beziehung zu deklarieren, wird das Attribut mappedBy verwendet. Das Attribut „mappedBy“ bezieht sich auf den Eigenschaftsnamen der Assoziation auf der Eigentümerseite.
@OneToOne(mappedBy="account")private EmployeeEntity employee;
Das Attribut „mappedBy“ erklärt, dass es für das Mapping von der Eigentümerentität abhängig ist.
Lassen Sie uns die obigen Mappings im laufenden Code testen:
Der laufende Code erstellt das gewünschte Schema in der Datenbank und führt diese SQL-Abfragen aus.
Sie können die Daten und Mappings in beiden Tabellen überprüfen, wenn Sie das obige Programm ausführen.
Hibernate one to one mapping with common join table
Dieser Ansatz ist nicht für alle von uns neu. Beginnen wir mit der gezielten DB-Struktur in dieser Technik.
In dieser Technik ist die wichtigste zu verwendende Annotation @JoinTable. Diese Annotation wird verwendet, um den neuen Tabellennamen (obligatorisch) und die Fremdschlüssel der beiden Tabellen zu definieren. Lassen Sie uns sehen, wie sie verwendet wird:
@JoinTable Annotation wird in der Klasse EmployeeEntity
verwendet. Sie erklärt, dass eine neue Tabelle EMPLOYEE_ACCOUNT
mit zwei Spalten EMPLOYEE_ID
(Primärschlüssel der Tabelle EMPLOYEE) und ACCOUNT_ID
(Primärschlüssel der Tabelle ACCOUNT) erstellt wird.
Das Testen der oben genannten Entitäten erzeugt die folgenden SQL-Abfragen in den Protokolldateien:
Hibernate one to one mapping with shared primary key
Bei dieser Technik stellt Hibernate sicher, dass ein gemeinsamer Primärschlüsselwert in beiden Tabellen verwendet wird. Auf diese Weise kann der Primärschlüssel von EmployeeEntity
sicher auch als Primärschlüssel von AccountEntity
angenommen werden.
Die Tabellenstruktur wird wie folgt aussehen:
In diesem Ansatz ist @PrimaryKeyJoinColumn die wichtigste zu verwendende Anmerkung. Sehen wir uns an, wie sie verwendet wird.
@OneToOne(cascade = CascadeType.ALL)@PrimaryKeyJoinColumnprivate AccountEntity account;
Auf der Seite AccountEntity
bleibt sie für das Mapping von der Eigentümerentität abhängig.
@OneToOne(mappedBy="account", cascade=CascadeType.ALL)private EmployeeEntity employee;
Das Testen der oben genannten Entitäten erzeugt die folgenden SQL-Abfragen in den Protokolldateien:
Hibernate One-to-One-Mapping mit @MapsId
Bei dieser Technik geht Hibernate davon aus, dass sowohl die Quelle als auch das Ziel die gleichen Primärschlüsselwerte haben.
In diesem Ansatz ist @MapsId die wichtigste Annotation, die verwendet wird. Sehen wir uns an, wie sie verwendet wird.
@Idprivate Integer employeeId;@OneToOne @MapsIdprivate AccountEntity account;
Auf der AccountEntity
-Seite bleibt sie für das Mapping von der Eigentümer-Entität abhängig.
@Idprivate Integer accountId;
Das Testen der oben genannten Entitäten erzeugt die folgenden SQL-Abfragen in den Protokolldateien: