Hibernate One to One Mapping Annotation Example

Hibernate アプリケーションに取り組んでいる場合、または将来取り組む予定の場合は、アプリケーション内の複数のエンティティ間の一対一の関係を容易に理解することができます。

Table of ContentsVarious supported techniques for one to one mapping1. Using foreign key association2. Using join table3. Using shared primary key4. @MapsId

Hibernate 1 対 1 マッピングの例では、Hibernate Hello World の例で書いた例を拡張して使用します。 ここでは、2 つのエンティティがあります。 EmployeeAccount です。

1 人の Employee は、1 つの Account しか持つことができません。 同様に、1 つのアカウントは 1 人の従業員のみに関連付けられます。 この例では 1 対 1 の関係です。

サポートされているさまざまなテクニック

Hibernate では、2 つのエンティティ間に 1 対 1 の関係を作成する方法が 3 つあります。 いずれの方法でも、@OneToOne アノテーションを使用する必要があります。

  1. 最初の手法は最も広く使用されており、テーブルの 1 つで外部キー列を使用します。
  2. 2 番目の手法は、最初の 2 つのテーブル間のマッピングを格納するために 3 番目のテーブルを持つという、かなり知られているソリューションを使用します。

Hibernate 1 対 1 マッピングと外部キー関連

この種の関連では、外部キー列は所有者エンティティに作成されます。 たとえば、EmployeeEntity を所有者にすると、Employee テーブルに余分な列 "ACCOUNT_ID" が作成されます。

テーブル構造は次のようになります。

このような関連を作成するには、EmployeeEntity クラスで Account 実体を次のように参照します。 これには referencedColumnName という名前のもう1つのパラメータがあります。 このパラメータは、結合に使用されるターゲット・エンティティ内の列を宣言します。

所有者側で@JoinColumnが宣言されていない場合、デフォルトが適用されます。 所有者テーブルに結合列が作成され、その名前は所有者側の関係名、_(アンダースコア)、および所有者側の主キー列の名前を連結したものになります。

双方向関係では、どちらか一方(そして一方のみ)が所有者でなければなりません。 所有者はアソシエーション列の更新に責任を持ちます。 関係に対して責任がない側を宣言するために、属性mappedByが使用される。 mappedBy」は、所有者側の関連付けのプロパティ名を指します。

@OneToOne(mappedBy="account")private EmployeeEntity employee;

上記の「"mappedBy」属性は、マッピングのために所有者エンティティに依存していることを宣言しています。

Hibernate one to one mapping with common join table

このアプローチは、私たちすべてにとって新しいものではありません。

この手法では、使用する主な注釈は @JoinTable です。 このアノテーションは、新しいテーブル名 (必須) と両方のテーブルからの外部キーを定義するために使用されます。 使用方法を見てみましょう。

@JoinTable アノテーションは、EmployeeEntity クラスで使用されます。 これは、2 つの列 EMPLOYEE_ID (EMPLOYEE テーブルの主キー) および ACCOUNT_ID (ACCOUNT テーブルの主キー) を持つ新しいテーブル EMPLOYEE_ACCOUNT を作成することを宣言します。

上記のエンティティをテストすると、ログ ファイルに次の SQL クエリが生成されます。 この方法では、EmployeeEntity の主キーは安全に AccountEntity の主キーとも見なされます。

テーブル構造は次のようになります:

このアプローチでは、@PrimaryKeyJoinColumn が主に使用する注釈です。

@OneToOne(cascade = CascadeType.ALL)@PrimaryKeyJoinColumnprivate AccountEntity account;

AccountEntity 側では、マッピングのために所有者エンティティに依存したままです。

@OneToOne(mappedBy="account", cascade=CascadeType.ALL)private EmployeeEntity employee;

上記のエンティティをテストすると、ログ ファイルで次の SQL クエリが生成されます。

この手法では、@MapsId が使用される主なアノテーションです。

@Idprivate Integer employeeId;@OneToOne @MapsIdprivate AccountEntity account;

AccountEntity 側では、マッピングのために所有者エンティティに依存したままです。

@Idprivate Integer accountId;

上記のエンティティをテストすると、ログ ファイルに次の SQL クエリが生成されます。

コメントを残す

メールアドレスが公開されることはありません。