Domaを触ってみた

初めて Doma を触ってみました。doma-sastruts-demoを動かしたり、Doma - クイックスタートを見ながらプロジェクトを作ったりして遊んだだけですが。

Domaフレームワーク非依存らしいので、せっかくだから生のTomcatプロジェクトに入れてみました。

  1. PostgreSQL8.4をインストールする(必須じゃないけど使ってみた)
  2. Eclipse3.5をインストールする
  3. EclipseTomcatプラグインをインストールする
  4. EclipseTomcatプロジェクトを作成する
  5. プロジェクトにDomaのjarを入れてパスを通す(Doma - セットアップ参照)
  6. プロジェクトに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で生成された実装クラスを覗いてみたら、水面下でこんなに色々作られているのかとびっくりしました。

他のフレームワークとセットで使うとしたら、どれがいいのかなぁ。。