这个问题的长期设置;请多多包涵。
在 JPA 中,您可以使用(例如)带@ManyToOne
注释的关系来存储对另一个实体的引用:
// In Wheel.java
@ManyToOne(optional = false)
@JoinColumn(name = "car_id", nullable = false)
private Car car;
在幕后,这通常由JOIN
. 如果您查看Wheel
映射到的表,您会发现一列可能命名为carId
or car_id
,并且该列将是“指向”的外键,例如car
表的主键。初级的东西。
有时(例如,当通过网络序列化根实体时),您只需要密钥本身:
// In Wheel.java
@Column(name = "car_id", nullable = false)
private int carId;
这也很好。
通常你看不到这两个。
当您确实看到这两个时,其中一个是使用 by-convention-because-the-spec-has-a-hole-in-it 修饰符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
淘汰,因为它将不再引用 right 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;
}
}
现在的问题是:
真的吗?这是始终存在给定关系的主键以及将关系本身“膨胀”到其目标的可能性的最佳或唯一方法吗?