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;
}
}