Entity Inheritance

JBossEJB3.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で十分可能だと思う
が、上記のカラムは他に使いどころがあるのだろうか?
コンテナがデータベースからオブジェクトを生成する時には必要になり
そうだ。一つのテーブルに親子が格納されている場合、子で追加された
カラムは親では値が設定されないが、それだけで親子を判別することは
危険だからだ。
コンテナのためのカラムか?