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

20560 ワード

複合キーふくごうキー:識別関係のマッピングひょうじかんけいのまっぷ



親も子供も孫も基本鍵を渡しています.識別関係では、親テーブルのプライマリ・キーを含む複合キーを構成する必要があります.

@IdClassとIDの関係

@Entity
public class Parent {

    @Id
    @Column(name = "PARENT_ID")
    private String id;

    private String name;

}

@Entity
@IdClass(ChildId.class)
public class Child {

    @Id
    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    public Parent parent;

    @Id
    @Column(name = "CHILD_ID")
    private String childId;

    private String name;

}

public class ChildId implements Serializable {

    private String parent; // Child.parent 매핑
    private String childId; // Child.childId 매핑

    // 생성자
    // equals, hashCode

}

@Entity
@IdClass(GrandChildId.class)
public class GrandChild {

    @Id
    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "PARENT_ID")
            @JoinColumn(name = "CHILD_ID")
    })
    private Child child;

    @Id
    @Column(name = "GRANDCHILD_ID")
    private String id;

    private String name;

}

public class GrandChildId implements Serializable {

    private ChildId child; // GrandChild.child 매핑
    private String id; // GrandChild.id 매핑

    // 생성자
    // equals, hashCode

}

@EmbeddedIdと識別関係

@Entity
public class Parent {

    @Id
    @Column(name = "PARENT_ID")
    private String id;

    private String name;

}

@Entity
public class Child {

    @EmbeddedId
    private ChildId id;

    @MapsId("parentId") // ChildId.parentId 매핑
    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    public Parent parent;

    private String name;

}

@Embeddable
public class ChildId implements Serializable {

    private String parentid; // @MapsId("parentId")로 매핑

    @Column(name = "CHILD_ID")
    private String id;

    // 생성자
    // equals, hashCode

}

@Entity
public class GrandChild {

    @EmbeddedId
    private GrandChildId id;

    @MapsId("childId") // GrandChildId.childId 매핑
    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "PARENT_ID"),
            @JoinColumn(name = "CHILD_ID")
    })
    private Child child;

    private String name;

}

@Embeddable
public class GrandChildId implements Serializable {

    private ChildId childid; // @MapsId("childId")로 매핑

    @Column(name = "GRANDCHILD_ID")
    private String id;

    // 생성자
    // equals, hashCode

}
以下に示すように、Childエンティティの親フィールドは@Idではなく@MapSidを使用します.@MapSidは、外部キーにマッピングされた関連関係をプライマリ・キーにマッピングすることを示します.@MapSidの属性値は、@EmbeddedIdの識別子クラスを使用するプライマリ・キー・フィールドを指定できます.
    @MapsId("parentId") // ChildId.parentId 매핑
    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    public Parent parent;
   

非識別関係の実装


@Entity
public class Parent {

   @Id
   @GeneratedValue
   @Column(name = "PARENT_ID")
   private Long id;

   private String name;

}

@Entity
public class Child {

   @Id
   @GeneratedValue
   @Column(name = "CHILD_ID")
   private Long id;

   private String name;

   @ManyToOne
   @JoinColumn(name = "PARENT_ID")
   private Parent parent;

}

@Entity
public class GrandChild {

   @Id
   @GeneratedValue
   @Column(name = "GRANDCHILD_ID")
   private Long id;

   private String name;

   @ManyToOne
   @JoinColumn(name = "CHILD_ID")
   private Child child;

}
もっと簡潔~~~!!!

一対一の識別関係



1対1の識別関係はサブテーブルのプライマリ・キー値であり、親テーブルのプライマリ・キー値のみが使用されます.したがって、親テーブルのプライマリ・キーが複合キーでない場合、サブテーブルのプライマリ・キーは複合キーで構成される必要はありません.
@Entity
public class Board {

    @Id
    @GeneratedValue
    @Column(name = "BOARD_ID")
    private Long id;

    private String title;

    @OneToOne(mappedBy = "board")
    private BoardDetail boardDetail;

}

@Entity
public class BoardDetail {

    @Id
    private Long boardId;

    @MapsId // BoardDetail.boardId 매핑
    @OneToOne
    @JoinColumn(name = "BOARD_ID")
    private Board board;

    private String content;

}

識別、非識別関係のメリットとデメリット


識別関係
長所
-デフォルトのキーインデックスを使用するのに適しています.
-親テーブルのプライマリ・キー列は、サブテーブルとサブテーブルで構成されているため、特定の場合は結合せずに検索できます.
短所
-親テーブルのプライマリ・キーをサブテーブルに伝播すると、サブテーブルのプライマリ・キー列が徐々に増加します.
-両亲は机を一つ、息子は机を二つ、孙は机を三つ…この場合、SQLは結合時に複雑になり、プライマリ・キー・インデックスを不要に増大させる可能性があります.
-基本キーとしてビジネス上のナチュラルキー列を使用します.
-ビジネス要件が変更されると、大量のコード変更が必要になります.
-表の構造が柔軟ではありません.
-1対1の関係に加えて、個別の複合キークラスを作成する必要があります.
非識別関係は思考を変えることができる.ORMの新しいプロジェクトが可能な場合は、必要な非識別関係を使用し、プライマリ・キーはLongタイプのプロキシ・キーを使用することが望ましい.