GeekFactory

int128.hatenablog.com

Doma 2をGroovyで使用する時に気を付けること

気付いた範囲でまとめてみます。

フォルダ配置

Doma 2はAnnotation ProcessorでDAOの実装クラスを自動生成します。Doma 2のAnnotation ProcessorJavaのコードにのみ対応しているため、DAOやエンティティはGroovyではなくJavaで書く必要があります。また、GroovyとJavaのコードが互いに参照する場合は両者を /src/main/groovy に配置する必要があります。

具体的には以下のような配置になります。

  • src/main/
    • groovy/
      • example/entity/
        • Hello.java エンティティクラスはJavaで書く必要がある Groovyで書いてもよい
      • example/dao/
        • HelloDao.java DAOインタフェースはJavaで書く必要がある
    • resources/
      • META-INF/example/dao/HelloDao/
        • selectById.sql

(4/18追記)エンティティクラスもAnnotation Processorで処理されるため、Javaで書く必要があるようです。

ビルドの設定

GroovyとJava/src/main/groovy に配置した場合、GroovyコンパイラがAnnotation Processorを実行することになるため、以下のように compileGroovy タスクに対して設定を適用します。

// build.gradle
plugins {
    id 'groovy'
}

dependencies {
    compile 'org.seasar.doma:doma:2.16.0'
}

processResources.destinationDir = compileGroovy.destinationDir
compileGroovy.dependsOn processResources

外部ドメインを利用する場合などAnnotation Processorの設定が必要な場合は、Groovyコンパイラに設定を渡します。

compileGroovy.options.compilerArgs = ['-Pdoma.domain.converters=example.framework.data.HelloConverter']

2.16.0からはAnnotation Processorの設定を /src/main/resources/doma.compile.config に書けます。これにより、ビルドツールやIDEでAnnotation Processorを設定する必要がなくなります。

その他

ドメインクラスは @Immutable@Canonical を使うと扱いやすいです。