it-swarm.com.ru

что такое @JoinColumn и как он используется в Hibernate

Я много читал о @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 Class ---- Entity
@JoinColumn(name="patient_id") ---- annotation
private Patient patient ----field

Это говорит; У Vehicle Entity есть внешний ключ для Patient entity с именем Patient_id. Добавьте Patient_id в качестве столбца в таблице Vehicle Entity

Должен ли параметр name элемента JoinColumn всегда быть Foreign Key или Primary Key?

Я читал это, но я все еще в замешательстве . JPA JoinColumn против mappedBy

17
zbryan

Однонаправленная ассоциация через таблицу соединений

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

}

Это базовая отправная точка использования @JoinColumn.

Чтобы убедиться, что внешний ключ (patient_id в таблице Vehicle) действительно отображается в таблице пациентов, вы можете использовать @JoinColumn(nullable = false)

@Entity
class Vehicle {

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

}
27
v.ladynev

Класс транспортного средства ---- сущность @ JoinColumn (name = "Patient_id") ---- аннотация Личный пациент Пациент ---- поле

Выше кода сгенерирует столбец Patient_id (внешний ключ) в классе Vehicle, который будет указывать на первичный ключ класса пациента.

MappedBy - Этот атрибут говорит нам, что это отношение будет управляться классом Vehicle. Пример. Если мы вставим транспортное средство, то будут введены два SQL-кода, если cascadetype - all/save. 1-й SQL будет вводить данные в таблицу пациента, а 2-й SQL будет вводить данные о транспортном средстве в таблицу транспортного средства со вставленным столбцом Patient_id столбца Vehicle, указывающим на кортеж пациента. 

2
Vishal nigam

Столбец соединения объявляется с аннотацией @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;
1
Lova Chittumuri

Почему patient_id (сгенерированный столбец, который является FK) в Таблице транспортных средств не имеет никакого значения, когда я запускаю свой код?

Все, что делает @JoinColumn, это указывает столбец для присоединения к ассоциации сущностей или коллекции элементов. Поскольку вы связали @JoinColumn с объектом класса Patient, именно поэтому в таблице Patient создается внешний ключ. 

Для получения дополнительной информации см. https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/JoinColumn.html

0
Randy Orton