Doma CodeGen PluginでJava16のrecord class/Kotlinのdata classのEntityを生成する
前提
org.domaframework.doma.codegen:2.0.0
Java16以上
テンプレートのカスタム方法
時代はイミュータブル…ということで、Java16のrecord classとKotlinのdata classを使ってEntityを生成するようにしてみました。
テンプレートファイルをカスタムできるらしく、公式ドキュメントでは、以下説明があります。
カスタムテンプレートファイルを作成するには、ファイル名を変更せずにコピーして内容を変更します。 次に、 templateDir オプションに指定されたディレクトリに配置します。
テンプレートファイルのカスタム
build.gradle.ktsのdomaCodeGen -> register -> templateDirにカスタムテンプレートファイルを指定します。
templateDir = file("src/main/resources/doma_codegen_template")
設定例
Java16のrecord classのEntityを生成する
以下の元とするentity.ftlをベースにいじっていきます。
で、完成したテンプレートが以下です。recordクラスは継承ができないため、useMappedSuperclassの設定を無視しています。
Kotlinのdata classのEntityを生成する
以下の元とするentity.ftlをベースにいじっていきます。
StringやLocalDateTimeがすべてnullable扱いになってしまうようで、その原因がこちらのようで、KotlinClassResolverで未定義はデフォルト値を"null"としていて、デフォルト値が"null"もnullableと判定する挙動と組み合わさって、この挙動になるようです。
そこで、デフォルト値が"null"じゃないLanguageClassResolverをbuild.gradle.kts上で定義し、それを参照するようにして回避しました。
で、完成したテンプレートが以下です。data classはJava16のrecordクラスと違って継承はできますが、ぼくの場合は継承を使わないので、useMappedSuperclassの設定を無視しています。
また元のentity.ftlだと、デフォルト値が設定されていましたが、nullableの場合のみnullのデフォルト値を設定するようにしています。
その他設定
デフォルトだと、EntityListener(データベースで言うトリガーみたいな機能)や抽象クラスが使われるらしいですが、不要であれば、以下設定をbuild.gradle.ktsのdomaCodeGen -> register -> entityブロックに付与します。
useListener = false
useMappedSuperclass = false
設定例
Discussion