Entity Inheritance
JBossのEJB3.0 TrailBlazerによると、EJB3.0ではEntityBeanに継承が使えるようになった。
これもPOJOベースになったことによるメリットだろう。
継承階層をリレーショナルモデルにマッピングするための戦略として、階層の各クラスを別のテーブルにマッピングする方法があるが、TrailBlazerでは一つのテーブルにマッピングする方法を説明している。
@Entity @Table(name = "record") @Inheritance(discriminatorValue="B") @DiscriminatorColumn(name="record_type") public class Record { // ... ... }
@Entity @Inheritance(discriminatorValue="T") public class TimedRecord extends Record { private Timestamp ts; // ... ... public Timestamp getTs () { return ts; } public void setTs (Timestamp ts) { this.ts = ts; } }
上が親クラス、下が子クラスになる。
親クラスのオブジェクトか、子クラスのオブジェクトかの違いは、
@DiscriminatorColumnで指定したカラムに設定される値で区別する。
@InheritanceのdiscriminatorValueで指定した値が設定され、
親クラスの場合は"B"が設定され、子クラスでは"T"が設定される。
Javaの世界では、親子を識別したい時はinstance ofで十分可能だと思う
が、上記のカラムは他に使いどころがあるのだろうか?
コンテナがデータベースからオブジェクトを生成する時には必要になり
そうだ。一つのテーブルに親子が格納されている場合、子で追加された
カラムは親では値が設定されないが、それだけで親子を判別することは
危険だからだ。
コンテナのためのカラムか?