Domaを触ってみた
初めて Doma を触ってみました。doma-sastruts-demoを動かしたり、Doma - クイックスタートを見ながらプロジェクトを作ったりして遊んだだけですが。
Domaはフレームワーク非依存らしいので、せっかくだから生のTomcatプロジェクトに入れてみました。
- PostgreSQL8.4をインストールする(必須じゃないけど使ってみた)
- Eclipse3.5をインストールする
- EclipseのTomcatプラグインをインストールする
- EclipseでTomcatプロジェクトを作成する
- プロジェクトにDomaのjarを入れてパスを通す(Doma - セットアップ参照)
- プロジェクトにPostgreのJDBCを入れてパスを通す
つまづいたところをちょろっとメモ。
META-INF以下のフォルダは、スペルミスに気をつけて作る
でも、エラーメッセージがわかりやすいから、間違えるとすぐ気づきますね。
アノテーションが効かないときは、環境設定と注釈対象をチェックする
上のような設定ミスかと思ったら、なんと、普段どおりエンティティでフィールドを宣言していました(インタフェースなのに…)。メソッドをオブジェクトとして扱う習慣がないせいかも。ドメイン脳への道は遠い。
クエリメソッドの引数には、実装クラスのインスタンスを渡す
クイックスタートの起動クラスで、selectByIdメソッドの引数がIntegerDomainになってますが、
public static void main(String[] args) { EmployeeDao dao = new EmployeeDao_(); Employee employee = dao.selectById(new IntegerDomain(3)); // ここ。 employee.employeeName().set("KING"); dao.update(employee); }
newできない…。これは、組み込み実装クラスのBuiltinIntegerDomain、もしくはIntegerDomainを実装したドメインクラスを自分で作って、指定したらいいんですよね(たぶん)。ドメインクラスを新規に作るなら、Daoにあるメソッドのパラメータの型も変えないとダメだけど。
SQLに変数がバインドされないときは、コメントの中身をチェックする
外だしSQLに変数がバインドされず、NullPointerExceptionがでて?と思ったら
/* の後ろや */ の直前に空白を入れてはいけません。
…! /* employeeId */ って書いてたよ。恥ずかしい。2WaySQL脳への道も遠いようです。
感想
ドメイン指向の初心者としては、こりゃまずドメイン指向に慣れないとって感じでした。
でも、タイプセーフな硬いドメインをリッチなクラスに育てていくのは、楽しいです。値を無理にIntegerやStringに開かずに、ビジネス的文脈(つまり、その値に必要なバリデーション)を持った本来の姿で扱えるのは、いいなぁ、と思いました。エンティティとSQLの結果セットを対応させる方式も、個人的には好き。ADO.NETで、結果セットの数だけDataTableを作る感覚に近いかも。
Seasar Conference のデモで感じたとおり、Domaは、エラーメッセージがやさしかったです。あと、aptで生成された実装クラスを覗いてみたら、水面下でこんなに色々作られているのかとびっくりしました。
他のフレームワークとセットで使うとしたら、どれがいいのかなぁ。。