JPA継承関係のマッピング
継承関係のマッピング
継承関係マッピングには、オブジェクトの継承関係をDBにマッピングする方法が含まれます.
リレーショナル・データベースは、オブジェクト向けの言語で継承されていない概念です.
逆に、スーパータイプのサブタイプ関係のモデリング方法は、オブジェクトの継承概念と最も似ています.
ORMでいう継承関係マッピングは,オブジェクトの継承構造とデータベースのスーパータイプサブタイプ関係のマッピングである.
オブジェクト継承モデル
スーパータイプサブタイプ論理モデルを実際の物理モデルのテーブルとして実装する場合、3つの方法が選択できます.
このポリシーを使用する場合、オブジェクトはタイプで区別できますが、テーブルにはタイプ概念がありません.したがって、タイプを区別するカラムを追加する必要があります.ここでは、DTYPE列を区切り列として使用します.
戦略に署名
結合ポリシーサンプルコード@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
@Id
@GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
}
@Entity
@DiscriminatorValue("B")
public class Book extends Item {
private String author;
private String isbn;
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item {
private String artist;
}
@Entity
@DiscriminatorValue("M")
public class Movie extends Item {
private String director;
private String actor;
}
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
@Id
@GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
}
@Entity
@DiscriminatorValue("B")
public class Book extends Item {
private String author;
private String isbn;
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item {
private String artist;
}
@Entity
@DiscriminatorValue("M")
public class Movie extends Item {
private String director;
private String actor;
}
@Ingeritance(strategy = IngeritanceType.JOINED)
:継承マッピングは親クラスで@Ingeretance
を使用します.結合ポリシーIngeritanceType.JOINED
を使用したマッピングポリシーを指定する必要があります.@DiscriminatorColumn(name = "DTYPE")
:親に区切りバーを指定します.この列を使用して、格納されているサブテーブルを区別します.デフォルト値はDTYPEなので、@DiscriminatorColumn
に縮小できます.@DiscriminatorValue("M")
:エンティティの保存時に区切りバーに入力する値を指定します.ムービーエンティティを指定すると、値MはDTYPEに区切り欄として格納されます.@Entity
@DiscriminatorValue("B")
@PrimaryKeyJoinColumn(name = "BOOK_ID") //ID 재정의
public class Book extends Item{
private String author; //저자
private String isbn; // ISBN
}
長所単一テーブルポリシー
単一のテーブル・ポリシーでは、次の図に示すように、名前付きのテーブルが1つしか使用されません.次に、どのサブデータが格納されているかを区切りバーで区切ります.クエリーでは結合は使用されないため、最も高速です.
このポリシーを使用する場合、サブエンティティマッピングのすべてのカラムにnullを許可する必要があることに注意してください.たとえば、Bookエンティティを保存する場合はnullを入力します.これは、ITEMテーブルのAUTOR、ISBN列のみを使用し、他のエンティティにマッピングされたARTist、DIRECTOR、ACTOR列を使用しないためです.
単一テーブル・ポリシーのサンプル・コード@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
@Id
@GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
}
@Entity
@DiscriminatorValue("B")
public class Book extends Item {
private String author;
private String isbn;
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item {
private String artist;
}
@Entity
@DiscriminatorValue("M")
public class Movie extends Item {
private String director;
private String actor;
}
InheritanceType.SINGLE_TABLE
を指定すると、単一のテーブルポリシーが使用されます.
すべてのコンテンツを1つのテーブルに統合するため、区切りバーを必須項目として使用する必要があります.単一テーブルポリシーの長所と短所は、単一テーブルを使用する特徴に関係します.
長所
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
@Id
@GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
}
@Entity
@DiscriminatorValue("B")
public class Book extends Item {
private String author;
private String isbn;
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item {
private String artist;
}
@Entity
@DiscriminatorValue("M")
public class Movie extends Item {
private String director;
private String actor;
}
@DiscriminatorColumn
@を設定する必要があります.DistributorValueが指定されていない場合、デフォルトではエンティティ名が使用されます.実装クラスごとのテーブルポリシー
各インプリメンテーション・クラスのテーブル・ポリシーは、下図に示すように、サブエンティティごとにテーブルを作成します.各サブテーブルには、必要なすべてのカラムが含まれています.
各インプリメンテーション・クラスのテーブル・ポリシーのサンプル・コード@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {
@Id
@GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
}
@Entity
public class Book extends Item {
private String author;
private String isbn;
}
@Entity
public class Album extends Item {
private String artist;
}
@Entity
public class Movie extends Item {
private String director;
private String actor;
}
InheritanceType.TABLE_PER_CLASS
を選択した場合は、実装クラスごとにテーブルポリシーを使用します.このポリシーは、サブエンティティごとにテーブルを作成します.通常、このポリシーは推奨されません.
長所
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {
@Id
@GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
}
@Entity
public class Book extends Item {
private String author;
private String isbn;
}
@Entity
public class Album extends Item {
private String artist;
}
@Entity
public class Movie extends Item {
private String director;
private String actor;
}
@MappedSuperclass
以前の転送では、継承関係マッピングは、親クラスと子クラスをデータベース・テーブルにマッピングしました.親がテーブルにマッピングされずに親を継承する子にのみマッピング情報を提供する場合は、@MappedSuperclass
を使用します.
抽象クラスと同様に、@Entityは実際のテーブルにマッピングされ、@MappedSuperClassは実際のテーブルにマッピングされません.これは、マッピング情報を継承するためにのみ使用されます.@MappedSuperclass
public abstract class BaseEntity {
@Id @GeneratedValue
private Long id;
private String name;
}
@Entity
@Setter
@Getter
public class Member extends BaseEntity{
// ID 상속
// NAME 상속
private String email;
...
}
public class Seller extends BaseEntity{
// ID 상속
// NAME 상속
private String shopName;
}
BaseEntityは、オブジェクトが主に使用する共通マッピング情報を定義します.子エンティティは、継承継承によってBaseEntityのマッピング情報を継承します.ここで、BaseEntityはテーブルにマッピングする必要はなく、サブエンティティに共通のマッピング情報を提供するだけです.そこで,@MappedSuperclassを用いた.@Entity
@AttributeOverride(name = "id", column = @Column(name = "MEMBER_ID"))
public class Member extends BaseEntity{
}
上のコードは、親からのid属性を継承するカラム名をMEMBER IDとして再定義します.
マッピング情報を再定義するには、@AttributeOverrides
または@AttributeOverride
を使用します.関連付けを再定義するには、@AssociationOverrides
または@AssociationOverride
を使用します.
@MappedSuperclassプロパティ
@MappedSuperclass
public abstract class BaseEntity {
@Id @GeneratedValue
private Long id;
private String name;
}
@Entity
@Setter
@Getter
public class Member extends BaseEntity{
// ID 상속
// NAME 상속
private String email;
...
}
public class Seller extends BaseEntity{
// ID 상속
// NAME 상속
private String shopName;
}
@Entity
@AttributeOverride(name = "id", column = @Column(name = "MEMBER_ID"))
public class Member extends BaseEntity{
}
@MappedSuperclassを使用すると、登録日、変更日、登録者、変更者など、複数のエンティティでよく使用される属性を効率的に管理できます.
出典:https://velog.io/@sa 1341/JPA-継承-関係-マッピング
Java ORM標準JPAプログラミング(金英漢著)
Reference
この問題について(JPA継承関係のマッピング), 我々は、より多くの情報をここで見つけました https://velog.io/@ybell1028/JPA-상속-관계-매핑テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol