シングルテーブルインヘリタンスを、サポートしていないORMでも使う


2010年 12月 13日

どのORMを採用するかでアプリケーションの作成方法は大きくかわってきます。
SQLをがりがり書くタイプのORMを採用したり、そもそもORMを使っていない場合、レイジーロードやシングルテーブルインヘリタンスなどの仕組みは自前で用意しなければなりません。

ここではEnumを使ってシングルテーブルインヘリタンスをサポートしていないORMでもシングルテーブルインヘリタンスを実現する方法を紹介します。
(S2JDBCのドキュメントにあるEnumを使って多態を表す例を参考にしました)

EntityからEnumに処理を委譲する

要は、Entityが行う処理をすべてEnumに委譲してやればよいのです。

できた!

。。。と思ったんですが、どこにもインヘリタンス(継承)が見つかりません。Enumは継承が使えません。
この問題はEnumに処理を書くのではなくEnumから振る舞いを取得する事で解決できます。

Enumから振る舞いを取得する

ではEnumから振る舞いを取得するように変更してみましょう。

Perlで書いたオブジェクト指向のプログラムみたいですが、PlayerBehaviorによるシングルテーブルインヘリタンスが実装できました!

S2JDBCやiBatisなどSQLをがりがり書くタイプのORM使っている、もしくはDBIしか使ってないから。。と嘆いている人、これで実装できます。
RubyとかPythonとか使っている人はちゃんとリッチなフレームワークを採用しましょう。