JPAの継承関係のマッピング


🖊 オブジェクト中心のデザインと表中心のデザインの違い

  • リレーショナル・データベースには継承関係はありません.
  • JPAは、継承関係をオブジェクト継承と同様のスーパータイプのサブタイプ関係モデリング方法にマッピングする.
  • 🖊 スーパータイプのサブタイプ関係を物理モデルに具体化するポリシー


  • 戦略に署名
    (1)表をスーパータイプとサブタイプで別々に配置する
    (2)スーパータイプテーブルにサブタイプテーブルの情報を追加する(DTYPE).
    (3)サブタイプテーブルの情報を取得する場合は,(2)の情報に結合してデータを取得する.
    利点:正規化.外部キー参照整合性制約によるストレージスペースの最適化
    欠点:クエリー時にクエリーが複雑で、結合を多く使用する(比較性能↓)

  • 単一テーブルポリシー
    (1)1つのテーブルにすべての継承関係を入れます.
    (2)サブタイプ情報が分かる情報(DTYPE)を追加する.
    利点:クエリーが簡単で速い.
    欠点:サブエンティティマッピングのすべてのカラムがNULLを許可し、状況に応じてパフォーマンス↓

  • 実装クラスごとのテーブルポリシー
    (1)実装クラスに格納されている情報に基づいてそれぞれテーブルを作成する.
    使用しないポリシー
  • 客体的な立場では、どんな戦略を選んでも影響を受けません.

    🖊 実際のコードの例

    
    @Entity
    @Inheritance(strategy = InheritanceType.~)
    @DiscriminatorColumn //DTYPE
    public class Parent{
    	...
    }
    
    @Entity
    @DiscriminatorColumn
    public class Child extends Parent{
    	...
    }
    	...
     Child child = new Child();
     child.set(...);
     em.persist(child);
            ...

    🖊 Mapped Superclass

    중복되는 속성을 모아놓은 클래스에 @MappedSuperClass를 달아두고 
    사용할 클래스에서 상속받아놓으면 간단하게 중복코드를 줄일 수 있다.
    
    이 클래스는 Entity가 아니고 매핑 정보만 제공할 뿐이다.
    따라서 이 클래스를 직접 사용 할 일이 없으므로 추상 클래스로 만들어두는 게 권장된다.