web-dev-qa-db-fra.com

qu'est-ce que @JoinColumn et comment est-il utilisé dans Hibernate?

J'ai beaucoup lu sur @JoinColumn mais je ne comprends toujours pas l'idée derrière.

Table de patient

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

Table de véhicule

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

Classe de patients

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

Classe de véhicule

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

Je suis confus sur la façon dont la partie de la classe de véhicule, quelle est la relation entre 

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

Est-ce que ça dit? L'entité véhicule a une clé étrangère à entité patient nommée patient_id. Ajoutez le patient_id en tant que colonne de la table Entité du véhicule

Le paramètre name de JoinColumn doit-il toujours être une clé étrangère ou une clé primaire?

Je lisais ça mais je suis toujours confus . JPA JoinColumn vs mappedBy

17
zbryan

Une association unidirectionnelle via une table de jointure

@Entity
class Patient {

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

}

@Entity
class Vehicle {

}

Une association bidirectionnelle via une table de jointure

@Entity
class Patient {

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

}

@Entity
class Vehicle {

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

}

Une association unidirectionnelle via une clé étrangère

@Entity
class Patient {

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

}

@Entity
class Vehicle {

}

Une association bidirectionnelle via une clé étrangère

@Entity
class Patient {

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

}

@Entity
class Vehicle {

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

}

C’est le point de départ de l’utilisation de @JoinColumn.

Pour vérifier que la clé étrangère (patient_id dans la table Vehicle) est vraiment mappée dans la table des patients, vous pouvez utiliser @JoinColumn(nullable = false).

@Entity
class Vehicle {

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

}
27
v.ladynev

Classe de véhicule ---- Entité @ JoinColumn (name = "patient_id") ---- annotation Privé Patient patient ---- champ

Le code ci-dessus générera une colonne patient_id (une clé étrangère) dans la classe Vehicle, qui pointe vers la clé primaire de la classe Patient.

MappedBy - Cet attribut nous indique que cette relation sera gérée par la classe Vehicle. Exemple. Si nous insérons un véhicule, alors deux SQL seront injectés si cascadetype est all/save. Le 1er SQL injectera les détails dans la table Patient et le 2ème SQL injectera les détails du véhicule dans la table des véhicules avec la colonne patient_id de la colonne Véhicule pointant sur le Tuple Patient inséré. 

2
Vishal nigam

La colonne de jointure est déclarée avec l'annotation @JoinColumn qui ressemble à l'annotation @Column. Il a encore un paramètre nommé référencéColumnName. Ce paramètre déclare la colonne de l'entité ciblée qui sera utilisée pour la jointure.

Dans une relation bidirectionnelle, l'un des côtés (et un seul) doit être le propriétaire: le propriétaire est responsable de la mise à jour de la ou des colonnes d'association. Pour déclarer un côté non responsable de la relation, l'attribut mappedBy est utilisé. mappedBy fait référence au nom de propriété de l'association du côté du propriétaire.

Voici un exemple de code:

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

Pourquoi est-ce que la patient_id (colonne générée qui est un FK) dans la table des véhicules n'a aucune valeur lorsque j'exécute mon code?

Tout ce que @JoinColumn fait consiste à spécifier une colonne pour joindre une association d'entités ou une collection d'éléments. Puisque vous avez associé @JoinColumn à un objet de la classe Patient, vous créez une clé étrangère dans la table Patient. 

Pour plus d'informations, veuillez consulter https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/JoinColumn.html

0
Randy Orton