JPA継承関係のマッピング(@Inheritance)
Itemオブジェクト(スーパータイプ)
@Entity
@Inheritance(strategy) //InheritanceType.JOINED || InheritanceType.SINGLE_TABLE || InheritanceType.TABLE_PER_CLASS
@DiscriminatorColumn //자동으로 DTYPE Column 생성 & 값 적재; InheritanceType.JOINED 일때만 사용하면 됨; 그 외에는 생략 가능
@Table(name = "p_item")
public abstract class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
Albumオブジェクト(サブタイプ)
@Entity
public class Album extends Item{
private String artist;
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
}
Bookオブジェクト(サブタイプ)
@Entity
public class Book extends Item{
private String author;
private String isbn;
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
}
Movieオブジェクト(サブタイプ)
@Entity
@DiscriminatorValue(value = "mov") //DTYPE에 적재될 값을 정할 수 있음; 기본은 객체 이름/클래스 명
public class Movie extends Item{
private String director;
private String actor;
public String getDirector() {
return director;
}
public void setDirector(String director) {
this.director = director;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
}
1. @Inheritnace(strategy = InheritanceType.JOINED), @Inheritnace(strategy = InheritanceType.SINGLE_TABLE), @Inheritnace(strategy = InheritanceType.TABLE_PER_CLASS):各結合ポリシー、単一テーブルポリシー、各実装クラスのテーブルポリシー
2.@DiscriminatorColumn:
DTYPE Columnを作成します.列の名前はname=""で変更できます
3. @DiscriminatorValue(value = "mov"):
存在しない場合、デフォルトではオブジェクト名/クラス名としてtupleにロードされます.プレゼンテーションにロードする名前を指定できます.
1. @Inheritance(strategy =
InheritanceType.JOINED)
メリット:
1.表規範化
2.外部キーによる整合性制約の参照
3.ストレージの効率化
欠点:
1.単純なクエリでは多くの結合(JOIN)を使用するため、パフォーマンスが低下する
2.クエリーが複雑
最も人気のある方法で、表を拡張しやすいです.
2. @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
メリット:
1.結合を必要とせず、通常、クエリのパフォーマンスが向上
2.クエリーが簡単
欠点:
1.サブエンティティマッピングのすべてのカラムがNULL
2.すべてのコンテンツを1つのテーブルに保存するため、テーブルが大きくなる可能性があります.場合によってはクエリのパフォーマンスが逆に遅くなります
したがって、単一のテーブルポリシーは、テーブルが単純であるか、拡張性が低い場合に適しています.
3. @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
メリット:
1.処理サブタイプを明確に区別する場合に有効
2.NOT NULL制約が使用可能
欠点:
1.複数のサブテーブルを問い合わせるときのパフォーマンスが低い(UNIXが必要)
実務では使わないほうがいいです.
これは、継承関係のテーブルをバンドルしないため、データベース設計者もORM専門家も好まない方法です.
Reference
この問題について(JPA継承関係のマッピング(@Inheritance)), 我々は、より多くの情報をここで見つけました https://velog.io/@k_ms1998/JPA-상속-관계-매핑Inheritanceテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol