20.高度なマッピング(1)
15538 ワード
20.高度なマッピング(1)
この章で説明する高度なマッピングは次のとおりです.
1.継承関係のマッピング
リレーショナル・データベースには、オブジェクト言語に関連する継承の概念はありません.逆に、下図に示すような「スーパータイプサブタイプ関係」(Super-type Sub-Type Relationship)のモデリング方法は、オブジェクトの継承概念に最も似ています.ORMでいう継承関係マッピングは,オブジェクトの継承構造とデータベースのスーパータイプサブタイプ関係のマッピングである.
スーパータイプサブタイプ論理モデルを実際の物理モデルテーブルに実装する場合、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が格納されます.
@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を使用する必要があります).
-サブテーブルを結合してクエリーするのは難しいです.
特長
-区切りバーは使用しません.
リファレンス
Reference
この問題について(20.高度なマッピング(1)), 我々は、より多くの情報をここで見つけました https://velog.io/@jsj3282/20.-고급-매핑1テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol