2

この質問への長いセットアップ。我慢してください。

JPA では、(たとえば)@ManyToOne注釈付きの関係を使用して、別のエンティティへの参照を格納できます。

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

内部では、これは通常、 によって実装されますJOIN。マップ先のテーブルを見ると、またはのWheelような名前の列が見つかり、その列は、たとえばテーブルの主キーを「指す」外部キーになります。初歩的なこと。carIdcar_idcar

場合によっては (ネットワーク上でルート エンティティをシリアル化する場合など)、キー自体が必要な場合があります。

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

これでもいいです。

通常、これらの両方は表示されません。

これらの両方が表示される場合、そのうちの 1 つは 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;

これを行ったら、リレーションシップにあったすべてのセッター メソッドが削除されていることを確認する必要があります。

// 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参照が編集されていることを確認する必要があります。nullCar

// 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