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.クエリーが複雑
  • データ保存時にINSERT SQL 2->Butを呼び出し、実際の操作に多くの労力を費やす必要がない
    最も人気のある方法で、表を拡張しやすいです.

    2. @Inheritance(strategy = InheritanceType.SINGLE_TABLE)




    メリット:
    1.結合を必要とせず、通常、クエリのパフォーマンスが向上
    2.クエリーが簡単
    欠点:
    1.サブエンティティマッピングのすべてのカラムがNULL
    2.すべてのコンテンツを1つのテーブルに保存するため、テーブルが大きくなる可能性があります.場合によってはクエリのパフォーマンスが逆に遅くなります
  • 図例の値NULLのColumn
    したがって、単一のテーブルポリシーは、テーブルが単純であるか、拡張性が低い場合に適しています.

    3. @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)




    メリット:
    1.処理サブタイプを明確に区別する場合に有効
    2.NOT NULL制約が使用可能
    欠点:
    1.複数のサブテーブルを問い合わせるときのパフォーマンスが低い(UNIXが必要)
  • サブテーブルクエリ
  • の統合が困難
    実務では使わないほうがいいです.
    これは、継承関係のテーブルをバンドルしないため、データベース設計者もORM専門家も好まない方法です.