1. 概要

このチュートリアルでは、埋め込みプロパティを含む1つのエンティティを単一のデータベーステーブルにマップする方法を説明します。

したがって、この目的のために、 Java Persistence API(JPA)によって提供される@Embeddableおよび@Embeddedアノテーションを使用します。

2. データモデルのコンテキスト

まず、companyというテーブルを定義しましょう。

company テーブルには、会社名、住所、電話番号などの基本情報と、担当者の情報が格納されます。

public class Company {

    private Integer id;

    private String name;

    private String address;

    private String phone;

    private String contactFirstName;

    private String contactLastName;

    private String contactPhone;

    // standard getters, setters
}

ただし、担当者は別のクラスに抽象化する必要があるようです。 問題はそれですこれらの詳細用に別のテーブルを作成する必要はありません。 では、何ができるか見てみましょう。

3. @Embeddable

JPAは、 @Embeddable アノテーションを提供して、クラスが他のエンティティによって埋め込まれることを宣言します。

担当者の詳細を抽象化するクラスを定義しましょう。

@Embeddable
public class ContactPerson {

    private String firstName;

    private String lastName;

    private String phone;

    // standard getters, setters
}

4. @Embedded

JPAアノテーション@Embeddedは、タイプを別のエンティティに埋め込むために使用されます。

次に、Companyクラスを変更してみましょう。 JPAアノテーションを追加し、個別のフィールドの代わりにContactPersonを使用するように変更します。

@Entity
public class Company {

    @Id
    @GeneratedValue
    private Integer id;

    private String name;

    private String address;

    private String phone;

    @Embedded
    private ContactPerson contactPerson;

    // standard getters, setters
}

その結果、エンティティ Company が作成され、連絡先の詳細が埋め込まれ、単一のデータベーステーブルにマッピングされます。

ただし、まだもう1つ問題があります。それは、JPAがこれらのフィールドをデータベース列にマップする方法です。

5. 属性のオーバーライド

つまり、フィールドは、元のCompanyクラスではcontactFirstNameと呼ばれ、ContactPersonクラスではfirstNameと呼ばれていました。 したがって、JPAは、これらをそれぞれ contact_first_nameおよびfirst_name、にマップする必要があります。

理想的とは言えないことは別として、現在複製されているphone列で実際に私たちを壊してしまいます。

したがって、@AttributeOverridesおよび@AttibuteOverrideを使用して、埋め込み型の列プロパティをオーバーライドできます。

これをCompanyエンティティのContactPersonフィールドに追加しましょう。

@Embedded
@AttributeOverrides({
  @AttributeOverride( name = "firstName", column = @Column(name = "contact_first_name")),
  @AttributeOverride( name = "lastName", column = @Column(name = "contact_last_name")),
  @AttributeOverride( name = "phone", column = @Column(name = "contact_phone"))
})
private ContactPerson contactPerson;

これらの注釈はフィールドに配置されるため、囲んでいるエンティティごとに異なるオーバーライドを設定できることに注意してください。

6. 結論

このチュートリアルでは、いくつかの埋め込み属性を使用してエンティティを構成し、それらを囲んでいるエンティティと同じデータベーステーブルにマップしました。 そのために、JavaPersistenceAPIによって提供される@Embedded @Embeddable @AttributeOverrides 、および@AttributeOverrideアノテーションを使用しました。

いつものように、例のソースコードはGitHubから入手できます。