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依存