@JoinColumnとmappedByの違い
1.はじめに
JPA関係は、単方向または双方向のどちらでもかまいません。それは単に、関連エンティティの一方または両方の属性としてそれらをモデル化できることを意味します。
エンティティ間の関係の方向を定義しても、データベースマッピングには影響しません。それは私達が私達のドメインモデルでその関係を使う方向を定義するだけです。
双方向の関係では、通常次のように定義します。
-
所有側
-
逆または参照側
@JoinColumn
アノテーションを使用すると、エンティティの関連付けや要素コレクションへの参加に使用する列を指定できます。一方、
mappedBy
属性は、関係の参照側(非所有側)を定義するために使用されます。
このクイックチュートリアルでは、JPAの
@ JoinColumn
と
mappedBy
の違いについて説明します。また、一対多の関連付けでそれらを使用する方法も紹介します。
2.初期設定
このチュートリアルを進めるために、2つのエンティティがあるとしましょう。
Employee
と
Email.
明らかに、従業員は複数のEメールアドレスを持つことができます。ただし、特定のEメールアドレスは1人の従業員に正確に属することができます。
それは彼らが一対多の関連を共有することを意味します。
また、RDBMSモデルでは、
Employee
の
id
属性を参照する外部キー
employee
id
を
Email__エンティティにあります。
3.
@ JoinColumn
アノテーション
1対多/多対1の関係では、所有側は通常、関係の「多数」の側で定義されます。通常、外部キーを所有する側です。
@ JoinColumn
アノテーションは、所有側の実際の物理マッピングを定義します。
@Entity
public class Email {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "employee__id")
private Employee employee;
//...
}
それは単に、私たちの
Email
エンティティが、私たちの
Employee
エンティティの主属性
id
を参照する
employee
id__という名前の外部キーカラムを持つことを意味します。
4.
mappedBy
属性
関係の所有側を定義したら、Hibernateはその関係をデータベースにマッピングするために必要なすべての情報をすでに持っています。この関連付けを双方向にするには、参照側を定義するだけです。逆または参照側は単に所有側にマッピングされます。
これを行うには、@ @ OneToMany
アノテーションの
mappedBy
属性を簡単に使用できます。それでは、私たちの
Employee__エンティティを定義しましょう。
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "employee")
private List<Email> emails;
//...
}
ここで、
mappedBy
の値は、所有側のassociation-mapping属性の名前です。
5.まとめ
このチュートリアルでは、
@ JoinColumn
と
mappedBy
の違い、およびそれらを1対多の双方向の関係で使用する方法を調べました。
@ JoinColumn
アノテーションは、所有側の実際の物理マッピングを定義します。一方、参照側は
@ OneToMany
アノテーションの
mappedBy
属性を使用して定義されます。
いつものように、ソースコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/hibernate5[Githubに追加]から入手できます。