Что такое @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.