8.13.1 継承クラスの種類
エンティティクラスの継承クラスの種類には,抽象エンティティクラス,マップドスーパークラス,および非エンティティクラスがあります。それぞれ説明します。
(1) 抽象エンティティクラス
抽象クラスはエンティティクラスとして定義できます。抽象エンティティクラスは,直接インスタンスを作成できない点が具象エンティティクラスとは異なります。抽象エンティティクラスは,エンティティとしてマップすることも,サブクラスのエンティティを操作・取得するためにクエリの対象に指定することもできます。
サブクラスでは,プロパティのアクセサメソッドをオーバーライドできます。ただし,永続化フィールドおよび永続化プロパティのO/Rマッピング情報をサブクラスでオーバーライドした場合,動作は保証しません。サブクラスでO/Rマッピング情報をオーバーライドする場合は,@AssociationOverrideや@AttributeOverrideなどを使用してください。
抽象エンティティクラスは,@EntityまたはO/Rマッピングファイルで指定します。
(2) マップドスーパークラス
マップドスーパークラスとは,エンティティクラスのスーパークラスになることができるクラスです。永続化フィールドやマッピング情報を定義でき,さらにこれらを継承するような構成にできます。
マップドスーパークラスは,特定のテーブルを指定できないため,@Tableの指定はできません。そのため,マップドスーパークラスをエンティティにすることはできません。マップドスーパークラスはエンティティクラスとは異なり,問い合わせができないため,EntityManagerやクエリの操作の引数に渡すこともできません。また,リレーションシップの対象にすることもできません。
マップドスーパークラスは,抽象クラスとしても,具象クラスとしても定義できます。クラスをマップドスーパークラスとして定義する場合は,@MappedSuperclass,またはO/Rマッピングファイルに<mapped-superclass>タグを定義します。マッピング情報は,継承されたエンティティクラスに対して提供されます。
マップドスーパークラスとして設計したクラスは,マッピングがサブクラスにだけ提供できるマッピングであることを除いて,エンティティクラスと同様の方法でマップできます。
エンティティがサブクラスとして適用されると,マップドスーパークラスで指定された情報が,サブクラスに継承されます。@AssociationOverrideやO/Rマッピングファイルで対応するXML要素を使用して,マッピング情報をサブクラス上でオーバーライドすることができます。
(3) エンティティ継承階層構造の非エンティティのクラス
エンティティクラスは非エンティティクラスのスーパークラスを持つことができます。スーパークラスは具象クラスおよび抽象クラスとして定義できます。
非エンティティクラスのスーパークラスには次に示す特長があります。
-
振る舞いだけを継承します。
-
状態は永続ではありません。
-
継承したすべての状態は,継承したエンティティクラスでも永続ではありません。
-
永続でない状態は,EntityManagerの制御の対象ではありません。
-
スーパークラスのアノテーションは無視されます。
非エンティティクラスをEntityManagerやQueryインタフェースのメソッドの引数にしたり,マッピング情報にしたりしないでください。CJPAプロバイダの場合,アプリケーションの実行時に例外が発生します。