@JoinColumnとmappedByの違い

@JoinColumnとmappedByの違い

1. 前書き

JPA関係は、単方向または双方向のいずれかです。 単に、関連するエンティティの1つまたは両方の属性としてモデル化できることを意味します。

エンティティ間の関係の方向を定義しても、データベースマッピングには影響しません。 ドメインモデルでその関係を使用する方向のみを定義します。

双方向の関係の場合、通常は次を定義します。

  • 所有側

  • 逆または参照側

@JoinColumnアノテーションは、エンティティの関連付けまたは要素コレクションの結合に使用する列を指定するのに役立ちます。 一方、mappedBy属性は、関係の参照側(非所有側)を定義するために使用されます。

このクイックチュートリアルでは、the difference between @JoinColumn and mappedByin JPA. We’ll also present how to use them in a one-to-many association.を見ていきます。

2. 初期設定

このチュートリアルに従うために、EmployeeEmail.の2つのエンティティがあるとします。

明らかに、従業員は複数のメールアドレスを持つことができます。 ただし、特定の電子メールアドレスは1人の従業員にのみ属することができます。

つまり、1対多の関連付けを共有します。

image

また、RDBMSモデルでは、Employeeid属性を参照する外部キーemployee_idEmailエンティティにあります。

3. @JoinColumn注釈

1対多/多対1の関係では、the owning side is usually defined on the ‘many' side of the relationship.通常、外部キーを所有する側です。

@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 emails;

    // ...
}

ここで、the value of mappedBy is the name of the association-mapping attribute on the owning side.これにより、EmployeeエンティティとEmailエンティティの間に双方向の関連付けが確立されました。

5. 結論

このチュートリアルでは、@JoinColumnmappedByの違いと、それらを1対多の双方向の関係で使用する方法について説明しました。

@JoinColumnアノテーションは、所有側の実際の物理マッピングを定義します。 一方、参照側は、@OneToManyアノテーションのmappedBy属性を使用して定義されます。

いつものように、ソースコードはover on Githubで利用できます。