Что такое @JoinColumn и как он используется в спящем режиме
Я много читал о @JoinColumn, но я до сих пор не понимаю его.
Таблица пациентов
CREATE TABLE patient (
patient_id BIGINT NOT NULL,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
PRIMARY KEY(patient_id));
Таблица автомобилей
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));
Класс пациента
@OneToMany(mappedBy = "patient")
private Collection<Vehicle> patientVehicles = new ArrayList<Vehicle>();
Класс автомобиля
@ManyToOne
@JoinColumn(name="patient_id")
private Patient patient;
Я смущен тем, как часть класса Vehicle, какова связь между
Vehicle Class ---- Entity
@JoinColumn(name="patient_id") ---- annotation
private Patient patient ----field
Говорит ли это; Объект имеет Внешний ключ для Объект пациента с именем patient_id.
Добавьте patient_id в качестве столбца в таблице Vehicle Entity
Должен ли параметр имени JoinColumn всегда быть внешним ключом или основным ключом?
Я читал это, но я все еще путаюсь.
JPA JoinColumn vs mappedBy
Ответы
Ответ 1
Однонаправленная ассоциация через таблицу соединений
@Entity
class Patient {
@OneToMany
private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();
}
@Entity
class Vehicle {
}
Двунаправленная ассоциация через таблицу соединений
@Entity
class Patient {
@OneToMany
private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();
}
@Entity
class Vehicle {
@ManyToOne(fetch = FetchType.LAZY)
private Patient patient;
}
Однонаправленная ассоциация через внешний ключ
@Entity
class Patient {
@OneToMany
@JoinColumn
private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();
}
@Entity
class Vehicle {
}
Двунаправленная ассоциация через внешний ключ
@Entity
class Patient {
@OneToMany(mappedBy = "patient")
private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();
}
@Entity
class Vehicle {
@ManyToOne(fetch = FetchType.LAZY)
private Patient patient;
}
Двунаправленная связь через внешний ключ со спецификацией имени внешнего столбца
@Entity
class Patient {
@OneToMany(mappedBy = "patient")
private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();
}
@Entity
class Vehicle {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="patient_id")
private Patient patient;
}
Это основная отправная точка использования @JoinColumn
.
Чтобы убедиться, что внешний ключ (patient_id
в таблице Vehicle
) действительно отображается в таблице пациентов, вы можете использовать @JoinColumn(nullable = false)
@Entity
class Vehicle {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="patient_id", nullable = false)
private Patient patient
}
Ответ 2
Класс автомобиля ---- Сущность
@JoinColumn (name= "patient_id" ) ---- аннотация
частный пациент-пациент ---- поле
Над кодом будет генерироваться столбец patient_id (внешний ключ) в классе Vehicle, который указывает на первичный ключ класса пациента.
MappedBy - этот атрибут говорит нам, что это отношение будет управляться классом Vehicle. Пример. Если мы вставим автомобиль, тогда два SQL будут введены, если cascadetype будет все/сохранено. 1-й SQL будет вводить данные в таблицу пациентов, а второй SQL будет вводить данные о транспортном средстве в таблице автомобилей с помощью столбца patient_id столбца Vehicle, указывающего на вставленный терпеливый кортеж.
Ответ 3
Столбец соединения объявляется с аннотацией @JoinColumn, которая выглядит как аннотация @Column. У него есть еще один параметр с именем referencedColumnName. Этот параметр объявляет столбец в целевом объекте, который будет использоваться для объединения.
В двунаправленных отношениях одна из сторон (и только одна) должна быть владельцем: владелец отвечает за обновление столбцов связи. Чтобы объявить сторону не ответственной за связь, используется атрибут mappedBy. mappedBy ссылается на имя свойства ассоциации на стороне владельца.
Вот пример кода:
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;
Ответ 4
Почему при запуске моего кода patient_id
(сгенерированный столбец, который является FK) в Таблице транспортных средств не имеет никакого значения?
Все, @JoinColumn
делает @JoinColumn
- это указывает столбец для присоединения к ассоциации сущностей или коллекции элементов. Поскольку вы @JoinColumn
с объектом класса Patient, именно поэтому внешний ключ создается в таблице Patient.
Для получения дополнительной информации см. Https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/JoinColumn.html.