Hibernateによるmiddle-out開発

Hibernate によるO/Rマッピング構築をしようと思うと、3つアプローチがあるらしい。

  • Javaソースを元に、 XDoclet とか使ってマッピングファイルとデータベース定義を生成する。top-down方式
  • データベース定義を元に、 Middlegen とか使ってマッピングファイルとJavaソースを生成する。bottom-up方式
  • マッピングファイルを元に、・hibernate-extensionsに入っている Ant タスクを使ってデータベース定義やJavaソースを生成する。middle-out方式。

各方式の検討は 忘れる前にメモろう Hibernate @ blog.keitap.com が結構わかり易いと思った。新規開発の場合、middle-outが楽かな、というのがいろいろ試した結果の結論。

保守段階で新規にhibernateを導入しようと思うと当然bottom-upになるんだけど。新規開発の場合、DDLはどうせ、あとで物理設計的に修正しなくちゃいけないわけだし、DDLマッピングファイルのどちらが書きやすいかといえばマッピングファイルだやな。

マッピングファイルを書くのとXDocletマークアップするのは手間は大して変わらないのだけど、問題は新規開発の場合、top-downでやろうとするとマークアップすべきPOJO、それも値オブジェクトみたいな単調なコーディングをひたすらやらなくてはならないってことだ。その点、middle-outなら値オブジェクトやら、複合キークラスやらは全部Antタスクが作ってくれる。DDLもとりあえずテストするには問題ないレベルのものが生成される。後工程でデータベース設計をもう一度見直して適当にViewとか作ればよろしい。

世間ではPOJOに対するXDocletマークアップの紹介が何かと目に付くし、EJB3.0も似た路線でいくとか聞くけれど、でもこれってあんまりいい方法じゃない気がする。2つほど小さなプロジェクトでXDoclet方式を使ってみての感想。

既存のPOJOに後から永続化機能を追加するならマッピングファイルを直接書けばいい。元のソースに触らない分いろいろ柔軟だ。既存のデータベース処理をHiberante化するならmiddlegenを使う。新規開発ならmiddle-outだ。XDocletの利点がよくわからない。生成されるPOJOが単純な値クラスじゃ困る場合でもgenerated-classメタタグを使ったり、HibernateSynchronizerを使ったりしてgeneration-gapすればよい話だし。あえて言うなら、後付けで永続化機能を追加する場合で且つマッピング方法の変更可能性が低い場合、XDocletならデータ構造についての情報が分散しないってことぐらいか。