2016-05-31 15 views
7

Ich habe viel über @JoinColumn gelesen, aber ich verstehe immer noch nicht die Idee dahinter.Was ist @JoinColumn und wie wird es in Hibernate verwendet?

Patiententisch

CREATE TABLE patient (
patient_id BIGINT NOT NULL, 
first_name VARCHAR(255) NOT NULL, 
last_name VARCHAR(255) NOT NULL, 
PRIMARY KEY(patient_id)); 

Fahrzeug Tabelle

CREATE TABLE vehicles (
patient_id BIGINT NOT NULL, 
vehicle_id BIGINT NOT NULL, 
vehicle_manufacturer VARCHAR(255), 
PRIMARY KEY (vehicle_id), 
CONSTRAINT patienthasmanyvehicle FOREIGN KEY(patient_id) REFERENCES patient(patient_id)); 

Patient Klasse

@OneToMany(mappedBy = "patient") 
    private Collection<Vehicle> patientVehicles = new ArrayList<Vehicle>(); 

Fahrzeugklasse

@ManyToOne 
@JoinColumn(name="patient_id") 
private Patient patient; 

Ich bin wie der Vehicle-Klasse Teil verwirrt, was ist die Beziehung zwischen

Vehicle Class ---- Entity 
@JoinColumn(name="patient_id") ---- annotation 
private Patient patient ----field 

es sagen Hat; Die Fahrzeugeinheit hat eine Fremdschlüssel zu Patientenentität mit dem Namen patient_id. Fügen Sie den patient_id als eine Spalte in der Tabelle Fahrzeug Entity

der Name Parameter des JoinColumn Sie sollten immer ein Fremdschlüssel oder Primärschlüssel sein?

Ich habe das gelesen, aber ich bin immer noch verwirrt. JPA JoinColumn vs mappedBy

Antwort

1

Fahrzeugklasse ---- Entity @JoinColumn (name = "patient_id") ---- Anmerkung Private Patient Patient ---- Feld

Above-Code wird eine Spalte patient_id erzeugen (a Fremdschlüssel) in der Fahrzeugklasse, die auf den Primärschlüssel der Patientenklasse verweist.

MappedBy - Dieses Attribut sagt uns, dass diese Beziehung von der Fahrzeugklasse verwaltet wird. Beispiel. Wenn wir ein Fahrzeug einfügen, werden zwei SQL injiziert, wenn Kaskadentyp All/Save ist. Das erste SQL wird Details in die Patiententabelle einbringen und das zweite SQL wird die Fahrzeugdetails in die Fahrzeugtabelle eingeben, wobei die Spalte patient_id der Spalte Fahrzeug auf das eingefügte Patiententupel zeigt.

+0

verwenden können, aber warum ist, dass die ** patient_id (generierte Spalte, die ein FK ist) ** in der ** Fahrzeug Tabelle ** hat keinen Wert, wenn ich meinen Code ausführen? – zbryan

+0

@zenlloyd Für eine unidirektionale Zuordnung ist es unmöglich. Für eine bidirektionale Es ist normal. –

+0

Gibt es eine Möglichkeit zu überprüfen, dass der Fremdschlüssel (Patient_id in der Tabelle Fahrzeug) tatsächlich in der Patiententabelle zugeordnet ist? – zbryan

16

Ein Verband über eine Tabelle beitreten

@Entity 
class Patient { 

    @OneToMany 
    private Collection<Vehicle> patientVehicles = new ArrayList<Vehicle>(); 

} 

@Entity 
class Vehicle { 

} 

Eine unidirektionale Assoziation über einen Fremdschlüssel

@Entity 
class Patient { 

    @OneToMany 
    @JoinColumn(name = "patient_id") 
    private Collection<Vehicle> patientVehicles = new ArrayList<Vehicle>(); 

} 

@Entity 
class Vehicle { 

} 

Bidirektionales Vereinigung über einen Fremdschlüssel

@Entity 
class Patient { 

    @OneToMany(mappedBy = "patient") 
    private Collection<Vehicle> patientVehicles = new ArrayList<Vehicle>(); 

} 

@Entity 
class Vehicle { 

    @JoinColumn(name="patient_id") 
    private Patient patient 

} 

Dies ist der grundlegende Ausgangs Punkt der Verwendung @JoinColumn.

Um sicherzustellen, dass der Fremdschlüssel (patient_id in der Vehicle Tabelle) wirklich in der Patienten-Tabelle abgebildet wird Ihnen @JoinColumn(nullable = false)

@Entity 
class Vehicle { 

    @JoinColumn(name="patient_id", nullable = false) 
    private Patient patient 

} 
+0

gibt es kein implizites '@ JoinColum', wenn Sie' @ OneToMany' angeben? Ich meine, sind eine Assoziation über eine Join-Tabelle, eine unidirektionale Assoziation über einen Fremdschlüssel, die mehr ist als nur ein Standard-Coulmn-Name und ein manueller Coulmn-Name? –

+0

@sql_dummy '@ JoinColumn' wird nicht für eine Join-Tabelle verwendet. Ich verstehe die zweite Frage nicht. Für die unidirektionalen und bidirektionalen Verknüpfungen haben Sie das gleiche Datenbankschema. –

+0

Ich meine ist '@ JoinColumn' nicht implizit angegeben, wenn ich @OneToMany angeben? Ich habe diesen Zweifel, weil ich 'Debug' Datei durchgehen sehe ich das Feld hat ähnliche 'binding' Wetter ich explizit' @ JoinColumn' verwenden oder nicht. (Ich denke, die Antwort auf meine Frage ist höchstwahrscheinlich "nein", aber warum ist ähnlich "binding") –

Verwandte Themen