ゆーたんのつぶやき

株式会社ノークリサーチにてIT関連のシニアアナリストとして活動しています。

PoEAAのマッピングパターンとHibernate



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属性を使って親クラスを指定することで
マッピング定義ファイルを親クラスと分けることができるようになりました。上記の例
はいずれも親クラスと同じマッピング定義ファイルにサブクラスの定義を記述していま
すが、これらを分けることでサブクラスの追加が容易になります。