@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に追加]から入手できます。