TimedRecordクラスはRecordクラスを継承します。インヘリタンス関係をマップするには異なるいくつかの方法が存在します。例えば、階層上の各クラスに対して別々のテーブルを使い、その関係に制約を設定するために外部キーを使うことが可能です。このトレイルでは、単一テーブルマッピング戦略(sigle table mapping strategy)というマッピング戦略を説明します。
単一テーブルマッピング戦略はEJB 3.0でのエンティティBeanのデフォルトとなるマッピング戦略です。それは基底となるRecordクラスとTimedRecordクラスの両方をを単一テーブルへマップします。このテーブルはそのクラス階層上のすべてのクラスのすべての属性を保持するためのカラムを持ちます。このテーブルの特殊なカラムが、特定の行がどのサブクラスのものかを識別するために使われます。マッピング戦略と識別カラム(differentiator column)は継承階層全体の基底クラスで指定されなければなりません。Recordクラスに@DiscriminatorColumnと@DiscriminatorValueアノテーションのタグを指定しています。この例では、Recordテーブルのrecord_typeカラムがクラス識別子(class differentiator)です。もしそれが値Bを持てば、現在行は(基底クラスである)Recordクラスのインスタンスを表現します。
@Entity
@Table(name = "record")
@DiscriminatorColumn(name="record_type")
@DiscriminatorValue(value="B")
public class Record {
// ... ...
}
TimedRecordクラスはRecordクラスを単に継承します。その@DiscriminatorValueアノテーションは、TimedRecordオブジェクトを表現するすべての行が値Tを識別カラムrecord_typeを持つことを指定します(このカラムは基底クラスRecordの@DiscriminatorColumnアノテーションによって指定されます)。
@Entity
@DiscriminatorValue (value="T")
public class TimedRecord extends Record {
private Timestamp ts;
// ... ...
public Timestamp getTs () {
return ts;
}
public void setTs (Timestamp ts) {
this.ts = ts;
}
}