[DB]テーブルをデザインしましょう!4

8257 ワード

複合キーと識別関係のマッピング


識別関係vs非識別関係


識別関係



親テーブルから関係を識別するプライマリ・キーを取得し、サブテーブルのプライマリ・キーと外部キーとして使用します.

非識別関係



非識別関係は、親テーブルのプライマリ・キーを受け入れ、子テーブルの外部キーとしてのみ使用される関係です.
*必須非識別関係
-外部キーはNULLを許可しません.関連関係を確立する必要があります.
*オプションの非識別関係
-外部キーがNULLであることを許可します.関連関係を作成するかどうかを選択できます.
「JPAで複数の識別子を使用するには、個別の識別子クラスが必要です.」

複合キーふくごうキー:非識別関係のマッピングひしきべつかんけいのまっぷ

@Entity
public class Hello {

    @Id
    private String id;

    @Id
    private string id2;
「JPAで複数の識別子を使用するには、個別の識別子クラスが必要です.」

@IdClass


@Entity
@IdClass(ParentId.class)
public class Parent {

    @Id
    @Column(name = "PARENT_ID1")
    private String id1; // ParentId.id1과 연결

    @Id
    @Column(name = "PARENT_ID2")
    private String id2; // ParentId.id2와 연결

    private String name;

}

public class ParentId implements Serializable {

    private String id1;
    private String id2;

    // 생성자
    // equals, hashCode

}
 
@IdClassを使用する場合、識別子クラスは次の条件を満たす必要があります.
識別子クラスの属性名は、エンティティで使用される識別子の属性名と同じである必要があります.
例のParent.id1, Parent.id 2とParentId.id1, ParentId.id 2は同じです.
シリアルインタフェースを実装する必要があります.
equals,hashCodeを実現しなければならない.
デフォルトのジェネレータが必要です.
識別子クラスは共通でなければなりません.
次に、サブクラスから外部キーに接続します.
Entity
public class Child {

    @Id
    private String id;

    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "PARENT_ID1",
                referencedColumnName = "PARENT_ID1"),
            @JoinColumn(name = "PARENT_ID2",
                referencedColumnName = "PARENT_ID2")
    })
    private Parent parent;

}
注:@JoinColumnのnameプロパティとReferencedColumnNameプロパティの値が同じ場合は、後者を省略できます.

@EmbeddedId

@Entity
public class Parent {

    @EmbeddedId
    private ParentId id;

    private String name;

}

@Embeddable
public class ParentId implements Serializable {

    @Column(name = "PARENT_ID1")
    private String id1;

    @Column(name = "PARENT_ID2")
    private String id2;

    // 생성자 구현
    // equals, hashCode 구현

}
直接Parentエンティティで識別子クラスを使用し、@EmbeddedId宣言を入力します.@IdClassとは異なり、@EmbeddedIdを適用する識別子クラスは、プライマリ・キーを識別子クラスに直接マッピングします.
@EmbeddedIdを適用する識別子クラスは、次の条件を満たす必要があります.
1.@Embeddable注記を追加します.
2.シリアルインタフェースを実装する必要があります.
3.equals、hashCodeを実装する必要があります.
4.基本ジェネレータが必要です.
5.識別子クラスは共通である必要があります.

@IdClass vs @EmbeddedId


後者は対象性に傾いているので多く使われていますが、長所と短所もあり、自分の好みで使うことができます.

注意事項


複合キーの場合、@GenerateValueは使用できません.