it-swarm.com.de

was ist @JoinColumn und wie wird es in Hibernate verwendet?

Ich habe viel über @JoinColumn gelesen, aber ich habe immer noch keine Idee dahinter.

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));

Fahrzeugtisch

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));

Patientenklasse

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

Fahrzeugklasse

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

Ich bin verwirrt, wie der Teil Fahrzeugklasse ist, in welcher Beziehung 

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

Sagt es; Die Fahrzeugentität hat einen Fremdschlüssel bis Patientenentität mit dem Namen patient_id. Fügen Sie die patient_id als Spalte in die Vehicle Entity-Tabelle ein.

Muss der name-Parameter der JoinColumn immer ein Foreign Key oder Primary Key sein?

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

17
zbryan

Eine unidirektionale Zuordnung über eine Join-Tabelle

@Entity
class Patient {

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

}

@Entity
class Vehicle {

}

Eine bidirektionale Zuordnung über eine Join-Tabelle

@Entity
class Patient {

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

}

@Entity
class Vehicle {

    @ManyToOne(fetch = FetchType.LAZY)
    private Patient patient;

}

Eine unidirektionale Zuordnung über einen Fremdschlüssel

@Entity
class Patient {

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

}

@Entity
class Vehicle {

}

Eine bidirektionale Zuordnung über einen Fremdschlüssel

@Entity
class Patient {

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

}

@Entity
class Vehicle {

    @ManyToOne(fetch = FetchType.LAZY)
    private Patient patient;

}

Dies ist der grundlegende Ausgangspunkt für die Verwendung von @JoinColumn.

Um zu überprüfen, ob der Fremdschlüssel (patient_id in der Vehicle-Tabelle) in der Patiententabelle wirklich zugeordnet ist, können Sie @JoinColumn(nullable = false)

@Entity
class Vehicle {

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

}
27
v.ladynev

Fahrzeugklasse ---- Entität @ JoinColumn (name = "patient_id") ---- Annotation Private Patient patient ---- Feld

Der obige Code generiert eine Spalte patient_id (einen 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-Anweisungen eingefügt, wenn der gesamte Kaskadentyp/save ist. 1st SQL fügt Details in die Patiententabelle ein, und 2nd SQL fügt Fahrzeugdetails in die Fahrzeugtabelle ein, wobei die Spalte patient_id der Spalte Fahrzeug auf Patient Tuple zeigt. 

2
Vishal nigam

Die Join-Spalte wird mit der Annotation @JoinColumn deklariert, die der Annotation @Column ähnelt. Es hat einen weiteren Parameter namens referencedColumnName. Dieser Parameter deklariert die Spalte in der Zielentität, die für den Join verwendet wird.

In einer bidirektionalen Beziehung muss eine der Seiten (und nur eine) der Eigentümer sein: Der Eigentümer ist für die Aktualisierung der Assoziationsspalten verantwortlich. Um eine Seite als für die Beziehung nicht verantwortlich zu erklären, wird das Attribut mappedBy verwendet. mappedBy verweist auf den Eigentümernamen der Assoziation.

Hier ist Beispielcode:

EntityOne : 
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TEST_ID")
    private EntityTwo entityTwo;

EntityTwo : 
      // bi-directional many-to-one association to EntityOne Here TEST_ID is the Primary key
    @OneToMany(mappedBy = "entityTwo")
    private List<EntityOne> entityOne;
1
Lova Chittumuri

Warum hat die patient_id (generierte Spalte, die eine FK ist) in der Vehicle Table keinen Wert, wenn ich meinen Code ausführte?

Alles, was @JoinColumn tut, ist die Angabe einer Spalte für den Beitritt zu einer Entitätszuordnung oder Element-Sammlung. Da Sie @JoinColumn mit dem Objekt "Patientenklasse" verknüpft haben, wird der Fremdschlüssel daher in der Patiententabelle erstellt. 

Weitere Informationen finden Sie unter https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/JoinColumn.html

0
Randy Orton