Entity Inheritance

前回気になった所をSpecで調べてみた。


継承階層のマッピング戦略は1階層1テーブルのみか?


Java Persistence API 2.1.10 Inheritance Mapping Strategiesより、


Specでは3つの戦略が規定されている。


Single Table per Class Hierarchy Strategy

  • 1継承階層1テーブル
  • 継承階層の型を横断する、つまりpolymorphicな処理をするクエリがある場合にGood
  • クラスの型を識別する“discriminator column”が必要


Table per Class Strategy

  • 1クラス1テーブル
  • polymorphicな処理に弱い
  • 継承階層の各型を扱うのに、SQLのUNIONに相当する処理を行う必要がある


Joined Subclass Strategy

  • 継承階層のルートに1テーブル
  • 各子には、追加されたプロパティとプライマリキーを持つテーブルを割り当て
  • 子テーブルのプライマリキーは親テーブルへのプライマリキーへの外部キーになる
  • polymorphicな処理も可能だが、子クラスの取得にjoinが必要。継承階層が深い場合パフォーマンス悪化の原因になる


上記のうち、実装することが定められているのは、Single Table per Class Hierarchy Strategy


DiscriminatorColumn、discriminatorValueのデフォルト値は?


DiscriminatorColumn
9.1.27 DiscriminatorColumn Annotationより、"TYPE"


discriminatorValue
9.1.24 Inheritance Annotationより、Persistence Provider依存