@JoinColumnとmappedByの違い
1. 序章
JPAリレーションシップは、単方向または双方向のいずれかになります。 これは単に、関連付けられたエンティティの1つまたは両方の属性としてそれらをモデル化できることを意味します。
エンティティ間の関係の方向を定義しても、データベースのマッピングには影響しません。 ドメインモデルでその関係を使用する方向を定義するだけです。
双方向の関係の場合、通常、次のように定義します。
- 所有側
- 逆または参照側
@JoinColumn アノテーションは、エンティティの関連付けまたは要素コレクションの結合に使用する列を指定するのに役立ちます。 一方、 mappedBy 属性は、関係の参照側(非所有側)を定義するために使用されます。
このクイックチュートリアルでは、 @JoinColumnとmappedByの違い
2. 初期設定
このチュートリアルに従うために、EmployeeとEmail。の2つのエンティティがあるとします。
明らかに、従業員は複数の電子メールアドレスを持つことができます。 ただし、特定の電子メールアドレスは正確に1人の従業員に属することができます。
これは、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;
// ...
}
ここ、
5. 結論
このチュートリアルでは、@JoinColumnとmappedByの違いと、それらを1対多の双方向の関係で使用する方法について説明しました。
@JoinColumn アノテーションは、所有側の実際の物理マッピングを定義します。 一方、参照側は、@OneToManyアノテーションのmappedBy属性を使用して定義されます。
いつものように、ソースコードはGithubでから入手できます。