文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

s2jdbc-genで自動生成するファイルをカスタマイズする

もし毎回手動で自動生成ファイルに手を入れているなら、自動化できますよ〜


f:id:treeapps:20180426142529p:plain

s2jdbc-genで自動生成されるentityですが、mysqlのtinyintがShort型で生成されたりして、微妙に使いにくかったりします。
そこで、自動生成されるentityやserviceをカスタマイズしてみることにしました。

s2jdbc-genプロジェクトをダウンロードする

http://s2container.seasar.org/2.4/ja/downloads.html
S2JDBC-Gen 2.4.45 ← ここからダウンロードする。

ダウンロード後、eclipseプロジェクトとしてインポートする。
(インポートの必要はありませんが、インポートした方が解りやすいです)

*.ftlファイルをコピーする

S2JDBC-Genのテンプレートは、配布ファイルのresources/tempaltesディレクトリ以下にあります。 エンティティクラスのテンプレートはjava/entity.ftlになります。 これをコピーして、修正を加えるのが良いでしょう。 テンプレートの記述方法についてはFreeMarker のドキュメントを参照してください。

http://s2container.seasar.org/2.4/ja/s2jdbc_gen/tasks/gen_entity.html

とのことです。配布ファイルって何?と思いますが、要はs2jdbc-genのプロジェクトのソースのことですね。
今回は直接entity.ftlを修正してしまいます。

直接と言ってもoverride扱いになるので、不要になればプロジェクトから削除すれば、内蔵のftlファイルが使用されます。
以下のファイルをプロジェクトにコピーします。

↑これを、自動生成するプロジェクトに、以下のようにコピーします。

entity.ftlを修正する


↑ここにあるentity.ftlを以下のように書き換えて、ShortをIntegerに、byte[]をStringに書き換えてみます。

    <#if useAccessor>private<#else>public</#if> ${attr.attributeClass.simpleName} ${attr.name}; 

↓以下のように書き換える。

  <#if attr.attributeClass.simpleName == "Short">
    <#if useAccessor>private<#else>public</#if> Integer ${attr.name};
  <#elseif attr.attributeClass.simpleName == "byte[]">
    <#if useAccessor>private<#else>public</#if> String ${attr.name};
  <#else>
    <#if useAccessor>private<#else>public</#if> ${attr.attributeClass.simpleName} ${attr.name};
  </#if>


gen-entityタスクを実行して確認する

カスタマイズしたテンプレートでgen-entityを実行し、entityをチェックします。
左が修正前、右が修正後です。

それぞれのテンプレートファイルと、生成されるファイルの対応は以下の通り。
entity.ftl → entity
names.ftl → entityNames
service.ftl → service
entitytest.ftl → entityTest
servicetest.ftl → serviceTest

私的には@Generatedのタイムスタンプが邪魔でしょうがないので、削除しました。
結構自動生成し直す機会があって、timestampの部分だけ常に変化するから、svnで差分扱いされてしまうのです。timestamp部分しか差分無くても・・

なるべくsvnで差分があるファイルだけをコミットしたいから、timestampが邪魔なのです。
timestampしか差分が無いファイルを、コミット対象から手動で除外していく無意味な作業から、開放されましょう!

@Generated(value = {<#list generatedInfoList as info>"${info}"<#if info_has_next>, </#if></#list>}, date = "${currentDate?datetime}")

以下のように書き換える。

@Generated(value = {<#list generatedInfoList as info>"${info}"<#if info_has_next>, </#if></#list>})

上が修正前、下が修正後です。

カラム名のprefix・suffixによって独自のアノテーションを付与するなど、カスタマイズし放題です!

今回は修正していませんが、タブではなく半角スペースでインデントされているので、タブに直したり、社内で使用しているコードフォーマッターを実行しても差分が無いよう、チマチマ修正するといいかと思います。