什么是@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 patientVehicles = new ArrayList(); 

车辆类

 @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

通过连接表进行关联

 @Entity class Patient { @OneToMany private Collection patientVehicles = new ArrayList(); } @Entity class Vehicle { } 

通过外键进行单向关联

 @Entity class Patient { @OneToMany @JoinColumn(name = "patient_id") private Collection patientVehicles = new ArrayList(); } @Entity class Vehicle { } 

通过外键进行双向关联

 @Entity class Patient { @OneToMany(mappedBy = "patient") private Collection patientVehicles = new ArrayList(); } @Entity class Vehicle { @JoinColumn(name="patient_id") private Patient patient } 

这是使用@JoinColumn的基本出发点。

要validation外键( Vehicle表中的patient_id )是否真正映射到@JoinColumn(nullable = false)表中,可以使用@JoinColumn(nullable = false)

 @Entity class Vehicle { @JoinColumn(name="patient_id", nullable = false) private Patient patient } 

车辆类—-实体@JoinColumn(名称=“patient_id”)—-注释私人患者患者—-字段

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

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

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

为什么运行我的代码时,Vehicle Table中的patient_id (生成的patient_id FK)没有任何值?

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

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