この質問への長いセットアップ。我慢してください。
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;
これでもいいです。
通常、これらの両方は表示されません。
これらの両方が表示される場合、そのうちの 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
参照が編集されていることを確認する必要があります。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;
}
}
そして今、質問:
本当に?これは、関係自体をそのターゲットに「膨らませる」可能性とともに、特定の関係の主キーを常に存在させるための最良または唯一の方法ですか?