3.2.5. エンティティ Bean 関係のマッピング
3.2.5.1. 1 対 1
エンティティ Bean は、
@OneToOne
を使用して 1 対 1 の関係で関連付けることができます。1 対 1 の関係には 3 つの種類があります。1 つは、関連付けられたエンティティが同じプライマリキー値を共有する場合、もう 1 つは、外部キーがいずれかのエンティティにより保持される場合 (1 対 1 の多様性をシミュレートするためにデータベースのこの FK カラムは制約する必要があることに注意してください)、最後は 2 つのエンティティ間のリンクを保存するために関係テーブルが使用される場合 (1 対 1 の多様性を確保するために各 fk に対して一意の制約を定義する必要があります) です。
最初に、共有されたプライマリキーを使用して実際の 1 対 1 関係をマップします。
@Entity public class Body { @Id public Long getId() { return id; } @OneToOne(cascade = CascadeType.ALL) @PrimaryKeyJoinColumn public Heart getHeart() { return heart; } ... }
@Entity public class Heart { @Id public Long getId() { ...} }
@PrimaryKeyJoinColumn
アノテーションを使用することにより、1 対 1 は true と指定されます。
以下の例では、関連付けられたエンティティは外部キーカラムによってリンクされます。
@Entity public class Customer implements Serializable { @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name="passport_fk") public Passport getPassport() { ... } @Entity public class Passport implements Serializable { @OneToOne(mappedBy = "passport") public Customer getOwner() { ... }
Customer
は Customer
テーブル内の passport_fk
という名前の外部キーカラムを使用して Passport
にリンクされます。結合カラムは @Column
アノテーションに似た @JoinColumn
アノテーションで宣言されます。結合カラムには referencedColumnName
という名前の 1 つまたは複数のパラメータが含まれます。このパラメータは結合に使用される対象エンティティのカラムを宣言します。非プライマリキーカラムに referencedColumnName
を使用する場合は、関連付けられたクラスは Serializable
である必要があります。また、非プライマリキーカラムに対する referencedColumnName
は、単一カラムを持つプロパティにマップする必要があります (他のクラスは動作しない場合があります)。
関係は双方向にすることができます。双方向の関係では、いずれか (一方のみ) が所有者である必要があります。所有者は関係カラムの更新を担当します。関係を担当しない側を宣言するために属性
mappedBy
が使用されます。mappedBy
は所有者側の関係のプロパティ名を参照します。この例では、これは passport
です。示されたように、結合カラムは所有者側ですでに宣言されているため、宣言する必要はありません (宣言しないでください)。
所有者側で
@JoinColumn
が宣言されていない場合は、デフォルト値が適用されます。所有者テーブルで結合カラムが作成され、その名前は、所有者側の関係の名前、_ (アンダースコア)、および所有者側のプライマリキーカラムの名前が結合されたものになります。この例では、プロパティ名が passport
、Passport
のカラム ID が id
であるため、passport_id
になります。
3 つ目の方法 (関係テーブルを使用) は非常に変わったものになります。
@Entity public class Customer implements Serializable { @OneToOne(cascade = CascadeType.ALL) @JoinTable(name = "CustomerPassports", joinColumns = @JoinColumn(name="customer_fk"), inverseJoinColumns = @JoinColumn(name="passport_fk") ) public Passport getPassport() { ... } @Entity public class Passport implements Serializable { @OneToOne(mappedBy = "passport") public Customer getOwner() { ... }
Customer
は、CustomerPassports
という名前の関係テーブルを使用して Passport
にリンクされます。この関係テーブルは、Passport
テーブルを参照する passport_fk
という名前の外部キーカラム ( inverseJoinColumn
により具体化される) と joinColumns
属性により具体化される Customer
テーブルを参照する customer_fk
という名前の外部キーカラムを持ちます。
このようなマッピングで結合テーブル名と結合カラムを宣言する必要があります。