20.高度なマッピング(1)


20.高度なマッピング(1)


この章で説明する高度なマッピングは次のとおりです.
  • 継承関係マッピング:オブジェクトの継承関係をデータベースにマッピングする方法を説明します.
  • @MappedSuperclass:登録日や変更日など、複数のエンティティで共通に使用されるマッピング情報のみを継承する場合に使用します.
  • 複合キーと識別関係マッピング:データベース内の1つ以上の識別子間でマッピングする方法を説明します.また,データベース設計で議論した識別関係と非識別関係についても議論する.
  • 結合テーブル:テーブルは外部キーで関連付けられますが、関連付けられた関係を管理する接続テーブルも作成できます.この接続テーブルのマッピング方法について説明します.
  • 複数のテーブルを1つの
  • エンティティにマッピングします.通常、1つのテーブルを1つのエンティティにマッピングしますが、複数のテーブルを1つのエンティティにマッピングすることもできます.このマッピング方法について説明します.
  • 1.継承関係のマッピング


    リレーショナル・データベースには、オブジェクト言語に関連する継承の概念はありません.逆に、下図に示すような「スーパータイプサブタイプ関係」(Super-type Sub-Type Relationship)のモデリング方法は、オブジェクトの継承概念に最も似ています.ORMでいう継承関係マッピングは,オブジェクトの継承構造とデータベースのスーパータイプサブタイプ関係のマッピングである.


    スーパータイプサブタイプ論理モデルを実際の物理モデルテーブルに実装する場合、3つの方法を選択できます.
    各テーブル
  • に変換:次の図(JOINED TABLE)に示すように、各テーブルをテーブルとして作成し、クエリー時に結合を使用します.JPAでは署名戦略と呼ばれています.
  • 統合テーブルに変換:次の図(SINGLE TABLE)に示すように、1つのテーブルのみで統合されます.JPAではシングルテーブル戦略と呼ばれています.
  • サブタイプテーブルに変換:下図に示すように、サブタイプごとにテーブルを作成します.JPAでは,実装クラスごとにテーブルポリシーと呼ぶ.
  • 前述した3つの方法を使用して、上図のオブジェクト継承モデルをマッピングします.

    1.契約戦略


    「結合ポリシー」(Joined Strategy)は、次の図に示すように、各エンティティを親テーブルのプライマリ・キーを受け入れ、プライマリ・キー+外部キーとして使用するテーブルとして作成するポリシーです.したがって、クエリーでは結合がよく使用されます.このポリシーを使用する場合、オブジェクトはタイプで区別できますが、テーブルにはタイプの概念がありません.したがって、区分タイプの列を追加する必要があります.ここでは、DTYPE列を区切り列として使用します.

    次のサンプルコードは、次の例の結合ポリシーを使用します.
    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    @DiscriminatiorColumn(name = "DTYPE")
    public abstract class Item {
    
        @Id @GeneratedValue
        @Column(name = "ITEM_ID")
        private Long id;
        
        private String name;  // 이름
        private int price;    // 가격
        ...
    }
    
    @Entity
    @DiscriminatorValue("M")
    public class Movie extends Item {
    
        private String director;  // 감독
        private String actor;     // 배우
        ...
    }
    マッピング情報を分析します.

  • @Inheritance(strateg=Inheritance Type.JOINED):継承マッピングは親クラスで@Inheritanceを使用する必要があります.次に、結合ポリシーが使用されているマッピングポリシーを指定する必要があります.したがって、InheritanceTypeです.JOINEDを使用しています

  • @DiscriptorColumn(name="DTYPE"):親に区切りバーを指定します.この列に格納されているサブテーブルを区別できます.デフォルトはDTYPEです.@DiscriptorColumnを使用できます.

  • @DistributorValue("M"):エンティティの保存時に区切りバーに入力する値を指定します.ムービーエンティティが保存されている場合は、セパレータDTYPEに値Mが格納されます.
  • デフォルトでは、サブテーブルは親テーブルのID列名を使用し、サブテーブルのデフォルトキー列名を変更する場合は@PrimaryKeyJoinColumnを使用します.次の例を示します.
    @Entity
    @DiscriminatorValue("B")
    @PrimaryKeyJoinColumn(name = "BOOK_ID")  // ID 재정의
    public class Book extends Item {
    
        private String author;   // 작가
        private String isbn;     // ISBN
        ...
    }
    BOOKテーブルのITEMIDプライマリ・キー・カラム名をBOOK IDに変更します.
    サイン戦略を整理します.

  • 長所
    -テーブルが正規化された.
    -外部キーを使用して整合性制約を参照できます.
    -ストレージスペースを有効に使用します.

  • 短所
    -クエリーで結合を頻繁に使用すると、パフォーマンスが低下する可能性があります.
    -クエリは複雑です.
    -INSERT SQLを2回実行してデータを登録します.

  • 特長
    -JPA規格の詳細は区切り欄を使用していますが、HyperNateを含む一部のインプリメンテーションでは区切り欄(@DisdictionatorColumn)を使用しなくても動作します.

  • 関連宣言
    - @PrimaryKeyJoinColumn, @DiscriminatorColumn, @DiscriminatorValue
  • 2.単一テーブルポリシー


    単一テーブルポリシー(Single-Table Strategy)は、下図に示すように、1つのテーブルのみを使用します.次に、どのサブデータが格納されているかを区切りバー(DRIVE)で区切ります.番号を調べる必要はないので、普通は一番速いです.

    このポリシーを使用する場合、サブエンティティマッピングのすべてのカラムに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("A")
    public class Album extends Item { ... }
    
    @Entity
    @DiscriminatorValue("M")
    public class Movie extends Item { ... }
    
    @Entity
    @DiscriminatorValue("B")
    public class Book extends Item { ... }
    Inheritance.SINGLE TABLEとして指定した場合は、単一テーブルポリシーが使用されます.すべてのコンテンツを1つのテーブルに統合するため、区切りバーを使用する必要があります.単一テーブルの長所と短所は、単一テーブルを使用する特徴に関係します.
    単一テーブルポリシーを整理します.

  • 長所
    -結合する必要はありません.一般的にクエリーのパフォーマンスが速いです.
    -クエリは簡単です.

  • 短所
    -サブエンティティマッピングのすべてのカラムにnullを許可する必要があります.
    -すべてのコンテンツを1つのテーブルに保存するため、テーブルが大きくなる可能性があります.そのため、クエリのパフォーマンスが逆に遅くなる場合があります.

  • 特長
    -区切りバーを使用する必要があります.したがって、@DistributorColumnを設定する必要があります.
    -@DistributorValueが指定されていない場合、デフォルトではエンティティ名が使用されます.(例えばMovie、Album、Book)
  • 3.各実装クラスのテーブルポリシー


    各インプリメンテーションクラスのテーブルポリシーは、下図に示すように、各サブエンティティにテーブルを作成します.また、各サブテーブルに必要なすべてのカラム.

    次の例では、各インプリメンテーション・クラスのテーブル・ポリシーをマッピングする方法を示します.
    @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 Album extends Item { ... }
    
    @Entity
    public class Movie extends Item { ... }
    
    @Entity
    public class Book extends Item { ... }
    InheritanceType.TABLE PER CLASSを選択すると、実装クラスごとにテーブルポリシーが使用されます.このポリシーは、サブエンティティごとにテーブルを作成します.これは一般的に推奨されない戦略です.
    実装クラスごとにテーブルポリシーを整理しましょう.

  • 長所
    -サブタイプの処理を区別する場合に有効です.
    -not null制約は使用できます.

  • 短所
    -複数のサブテーブルを同時にクエリーする場合はパフォーマンスが低下します(SQLでUNIXを使用する必要があります).
    -サブテーブルを結合してクエリーするのは難しいです.

  • 特長
    -区切りバーは使用しません.
  • このポリシーは、データベース設計者やORM専門家が推奨しないポリシーです.条件または単一テーブルポリシーを考慮します.
    リファレンス
  • Java ORM標準JPAプログラミング