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
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
}
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é.
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;
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