我一直在阅读很多关于@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
通过连接表进行单向关联
@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
}
车辆类----实体@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> entityOne;
为什么运行我的代码时,车辆表中的
patient_id
(生成的列是FK)没有任何值?
所有@JoinColumn
都会指定一个用于连接实体关联或元素集合的列。由于您已将@JoinColumn
与Patient类对象关联,因此在Patient表上创建了外键。
有关更多信息,请参阅https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/JoinColumn.html