[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タイプのプロキシ・キーを使用することが望ましい.
Reference
この問題について([DB]テーブルをデザインしましょう!5), 我々は、より多くの情報をここで見つけました https://velog.io/@tjdud3550/DB-테이블을-설계하자-5テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol