存储关系及其主键的JPA最佳实践是什么?

时间:2013-03-06 19:06:42

标签: jpa

对这个问题的长期设定;请耐心等待。

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

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

在幕后,这通常由JOIN实施。如果您查看Wheel映射到的表,您会发现一个列可能名为carIdcar_id的列,该列将是一个“指向”的外键,比如说,car表的主键。基本的东西。

有时(例如,当通过网络序列化根实体时),您只需要密钥本身:

// In Wheel.java
@Column(name = "car_id", nullable = false)
private int carId;

这也没关系。

通常你没有看到这两个。

当你看到这两个时,其中一个是使用by-convention标记的,因为它的规格有一个洞中的修饰符insertable = falseupdatable = 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;
  }
}

现在的问题是:

?这是给定关系总是存在主键的最佳或唯一方式,以及将关系本身“膨胀”为目标的可能性吗?

0 个答案:

没有答案