2

这个问题的长期设置;请多多包涵。

在 JPA 中,您可以使用(例如)带@ManyToOne注释的关系来存储对另一个实体的引用:

// In Wheel.java
@ManyToOne(optional = false)
@JoinColumn(name = "car_id", nullable = false)
private Car car;

在幕后,这通常由JOIN. 如果您查看Wheel映射到的表,您会发现一列可能命名为carIdor 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;
  }
}

现在的问题是:

真的吗?这是始终存在给定关系的主键以及将关系本身“膨胀”到其目标的可能性的最佳或唯一方法吗?

4

0 回答 0