Martin Fowler氏のPoEAA(Pattern of Enterprise Application Architecture)の中で
クラスの継承をどうやってリレーショナルデータベースにマッピングするかのパターンが
紹介されています。パターンは全部で3つで
・Single Table Inheritance
同一の継承ツリーにあるクラスを全て同一のテーブルにマッピングする
・Class Table Inheritance
サブクラスで追加されたプロパティの部分のみ別テーブルにマッピングし
サブクラスのインスタンスを取得する際には複数のテーブルを結合する
・Concrete Table Inheritance
サブクラス毎に個別のテーブルにマッピングする
ということになっています。
Hibernateもちょうどこれに対応するマッピングの設定を持っていますので
整理のためにちょっとまとめてみました。
・subclass
これがPoEAAでの「Single Table Inheritance」に相当します。
この場合の特徴は同じテーブル内でクラスの種別を識別するために
識別子(descriminator)が必要になる点です。各クラスの定義で
descriminatorが指定されています。
・joined-subclass
PoEAAでの「Class Table Inheritance」に相当するものです。
このケースではdescriminatorがなくなった代わりにサブクラスに
定義が入っています。このkeyカラムによって結合対象となる親クラスのレ
コードを特定します。subclass側にもtable属性がありますので、サブクラス
で追加された属性については親クラスとは別のテーブルに格納されることが
わかります。
・union-subclass
この場合には全く別のテーブルになるので、親クラスに存在しているプロパティも
サブクラスで定義しています。実質的には個別にマッピングを行なったのとほとん
ど差はありません。
Hibernate3.xからはサブクラス定義にextends属性を使って親クラスを指定することで
マッピング定義ファイルを親クラスと分けることができるようになりました。上記の例
はいずれも親クラスと同じマッピング定義ファイルにサブクラスの定義を記述していま
すが、これらを分けることでサブクラスの追加が容易になります。