私は@JoinColumnについて多くのことを読んでいますが、その背後にあるアイデアはまだ得られていません。
患者テーブル
CREATE TABLE patient (
patient_id BIGINT NOT NULL,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
PRIMARY KEY(patient_id));
車両テーブル
CREATE TABLE vehicles (
patient_id BIGINT NOT NULL,
vehicle_id BIGINT NOT NULL,
vehicle_manufacturer VARCHAR(255),
PRIMARY KEY (vehicle_id),
CONSTRAINT patienthasmanyvehicle FOREIGN KEY(patient_id) REFERENCES patient(patient_id));
患者クラス
@OneToMany(mappedBy = "patient")
private Collection<Vehicle> patientVehicles = new ArrayList<Vehicle>();
車両クラス
@ManyToOne
@JoinColumn(name="patient_id")
private Patient patient;
Vehicleクラスがどのように関係しているのか、どのような関係があるのか混乱しています
Vehicle Class ---- Entity
@JoinColumn(name="patient_id") ---- annotation
private Patient patient ----field
それは言いますか; Vehicle Entityには、Foreign KeytoPatient entitynamedpatient_idpatient_idをVehicle Entityテーブルの列として追加します
JoinColumnのnameパラメーターは常に外部キーまたは主キーである必要がありますか?
私はこれを読んでいますが、私はまだ混乱しています。 JPA JoinColumn vs mappedBy
結合テーブルを介した単方向の関連付け
@Entity
class Patient {
@OneToMany
private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();
}
@Entity
class Vehicle {
}
結合テーブルを介した双方向の関連付け
@Entity
class Patient {
@OneToMany
private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();
}
@Entity
class Vehicle {
@ManyToOne(fetch = FetchType.LAZY)
private Patient patient;
}
外部キーによる単方向の関連付け
@Entity
class Patient {
@OneToMany
@JoinColumn
private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();
}
@Entity
class Vehicle {
}
外部キーを介した双方向の関連付け
@Entity
class Patient {
@OneToMany(mappedBy = "patient")
private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();
}
@Entity
class Vehicle {
@ManyToOne(fetch = FetchType.LAZY)
private Patient patient;
}
外部列名を指定した外部キーを介した双方向の関連付け
@Entity
class Patient {
@OneToMany(mappedBy = "patient")
private Collection<Vehicle> vehicles = new ArrayList<Vehicle>();
}
@Entity
class Vehicle {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="patient_id")
private Patient patient;
}
これは、@JoinColumn
を使用する基本的な出発点です。
外部キー(Vehicle
テーブルのpatient_id
)が患者テーブルに実際にマッピングされていることを確認するには、@JoinColumn(nullable = false)
を使用できます
@Entity
class Vehicle {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="patient_id", nullable = false)
private Patient patient
}
車両クラス----エンティティ@JoinColumn(name = "patient_id")----注釈private患者Patient ---- field
上記のコードは、Vehicleクラスのpatient_id列(外部キー)を生成し、Patientクラスの主キーを指します。
MappedBy-この属性は、この関係がVehicleクラスによって管理されることを示しています。例。車両を挿入すると、cascadtypeがall/saveの場合、2つのSQLが挿入されます。 1番目のSQLは、Patientテーブルに詳細を挿入し、2番目のSQLは、Vehicle列のpatient_id列が挿入されたPatient Tupleを指すVehicleテーブルに車両詳細を挿入します。
結合列は、@ Columnアノテーションのように見える@JoinColumnアノテーションで宣言されます。 referencedColumnNameという名前のパラメーターがもう1つあります。このパラメーターは、結合に使用されるターゲットエンティティの列を宣言します。
双方向の関係では、サイドの1つ(1つのみ)が所有者である必要があります。所有者は関連付け列の更新を担当します。関係の責任を負わない側を宣言するには、属性mappedByを使用します。 mappedByは、所有者側の関連付けのプロパティ名を参照します。
サンプルコードは次のとおりです。
EntityOne :
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEST_ID")
private EntityTwo entityTwo;
EntityTwo :
// bi-directional many-to-one association to EntityOne Here TEST_ID is the Primary key
@OneToMany(mappedBy = "entityTwo")
private List<EntityOne> entityOne;
コードを実行したときに、Vehicleテーブルの
patient_id
(FKである生成列)に値がないのはなぜですか?
@JoinColumn
は、エンティティの関連付けまたは要素コレクションに参加するための列を指定するだけです。 @JoinColumn
をPatientクラスオブジェクトに関連付けているため、Patientテーブルに外部キーが作成されます。
詳細については https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/JoinColumn.html を参照してください