OneToMany - Was sind die Unterschiede zwischen Join-Tabelle und Fremdschlüssel?

8

Es besteht die Möglichkeit, die @OneToMany Beziehungs-Join-Tabelle mit der @JoinColumn Annotation zu deaktivieren. Der Standardwert ist eine Join-Tabelle.

Was sind die Vor- und Nachteile für ein Produktionssystem zum Beispiel?
Wann sollte ich eine Join-Tabelle verwenden und wann nicht?

Danke.

    
Piotr Nowicki 20.12.2011, 08:24
quelle

3 Antworten

18

Standardmäßig erstellt @OneToMany nur dann eine Join-Tabelle, wenn Sie die unidirektionale Beziehung verwenden.

Mit anderen Worten, wenn Sie die Entitäten Employee und Project haben und die Entität Employee wie folgt definiert ist (vorausgesetzt, es gibt keine orm.xml Einträge für diese Entitäten) :

%Vor%

Der JPA-Anbieter erstellt eine Join-Tabelle (Beachten Sie, dass in mappedBy Annotation kein @OneToMany -Attribut vorhanden ist, da es keinen Verweis auf Employee -Entität von Project gibt).

Wenn Sie andererseits eine bidirektionale Beziehung verwenden:

%Vor%

Die Join-Tabelle wird nicht verwendet, da dort die Seite "many" verwendet wird, um den Fremdschlüssel für diese Beziehung zu speichern.

Sie können jedoch die Verwendung der Join-Tabelle auch dann erzwingen, wenn Sie eine bidirektionale @OneToMany -Beziehung mit dem definierten mappedBy -Attribut haben. Sie können dies mithilfe der @JoinTable Annotation auf der besitzenden Seite der Beziehung erreichen .

Es besteht auch die Möglichkeit, wie bereits erwähnt, @JoinColumn zu verwenden, wenn die Join-Tabelle standardmäßig verwendet wird (unidirektionale @OneToMany -Beziehung).

Es ist am besten, den Leistungsunterschied der FK zu testen und für sich selbst zu arbeiten. Ich kann nur vermuten, dass weniger Joins (in diesem Fall: FK) scheint eine bessere Leistung zu haben.

Außerdem definiert der DBA manchmal das Datenbankschema und Sie müssen nur Ihre Zuordnungen an das vorhandene Schema anpassen. Dann haben Sie keine Wahl über FK oder Join Tabelle - deshalb haben Sie die Wahl.

    
Piotr Nowicki 20.12.2011, 16:05
quelle
0

Wie in den obigen Kommentaren erwähnt, wird Hibernate standardmäßig für Join-Tabelle verwendet. Dies führt zu einer besseren Normalisierung der Datenbasis.

Wenn Sie eine Auswahlmöglichkeit haben, bietet JoinColumn eine bessere Performance über die Join-Tabelle, wenn die Notwendigkeit für das Hinzufügen einer zusätzlichen Tabelle in der SQL-Abfrage aufgehoben wird.

    
ininprsr 31.08.2015 09:20
quelle
0

Join-Tabellen werden für Polymorphismen benötigt. Wenn beispielsweise Employee und Manager dasselbe Projekt verknüpfen und sie mit einer Strategie für eine Tabelle pro Klasse verknüpft sind, bezieht sich die einzige Möglichkeit, das Projekt zu kennen (id = 1, emp_id = 10) auf relationale DB-Ebene auf einen Manager Geben Sie emp_id in die Tabelle manager_2_employee ein. Wenn man sich nicht in einer solchen Situation befindet, kann emp_id direkt in das Projekt gehen.

    
zakmck 11.07.2012 14:50
quelle