对这个问题的长期设定;请耐心等待。
在JPA中,您可以使用(例如)@ManyToOne
- 注释关系存储对另一个实体的引用:
// In Wheel.java
@ManyToOne(optional = false)
@JoinColumn(name = "car_id", nullable = false)
private Car car;
在幕后,这通常由JOIN
实施。如果您查看Wheel
映射到的表,您会发现一个列可能名为carId
或car_id
的列,该列将是一个“指向”的外键,比如说,car
表的主键。基本的东西。
有时(例如,当通过网络序列化根实体时),您只需要密钥本身:
// In Wheel.java
@Column(name = "car_id", nullable = false)
private int carId;
这也没关系。
通常你没有看到这两个。
当你做看到这两个时,其中一个是使用by-convention标记的,因为它的规格有一个洞中的修饰符insertable = false
和updatable = false
:
// In Wheel.java
@ManyToOne
@JoinColumn(name = "car_id", insertable = false, updatable = false, nullable = false)
private Car car;
@Column(name = "car_id", nullable = false)
private int carId;
执行此操作后,您现在必须确保删除关系中 的所有setter方法:
// In Wheel.java
public Car getCar() {
return this.car;
}
// No longer appropriate now that the relationship is read-only
// public void setCar(final Car car) {
// this.car = car;
// }
但是,您必须确保可以设置carId
变量,并且在更改时,您必须确保Car
引用已null
输出,因为它将不再引用右Car
:
// In Wheel.java
public int getCarId() {
return this.carId;
}
public void setCarId(final int newId) {
final int old = this.getCarId();
this.carId = newId;
if (old != newId) {
this.car = null;
}
}
现在的问题是:
真?这是给定关系总是存在主键的最佳或唯一方式,以及将关系本身“膨胀”为目标的可能性吗?