什么是@JoinColumn以及如何在Hibernate中使用它

问题描述 投票:23回答:4

我一直在阅读很多关于@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

是吗?车辆实体具有名为patient_id的患者实体的外键。将patient_id添加为Vehicle Entity表中的列

JoinColumn的name参数应该始终是外键还是主键?

我一直在读这个,但我仍然感到困惑。 JPA JoinColumn vs mappedBy

java hibernate postgresql jpa
4个回答
33
投票

通过连接表进行单向关联

@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(名称=“patient_id”)----注释私人患者患者----字段

上面的代码将在Vehicle类中生成一列Patient_id(外键),该列将指向Patient Class主键。

MappedBy - 该属性告诉我们这个关系将由Vehicle类管理。例。如果我们插入车辆,那么如果cascadetype是全部/保存,则将注入两个SQL。第一个SQL将在Patient表中注入详细信息,第二个SQL将在车辆表中注入车辆详细信息,其中vehicles_id列的Vehicle列指向插入的患者元组。


1
投票

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

0
投票

为什么运行我的代码时,车辆表中的patient_id(生成的列是FK)没有任何值?

所有@JoinColumn都会指定一个用于连接实体关联或元素集合的列。由于您已将@JoinColumn与Patient类对象关联,因此在Patient表上创建了外键。

有关更多信息,请参阅https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/JoinColumn.html

© www.soinside.com 2019 - 2024. All rights reserved.