山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

ant活用術(Hibernate Tools続き)

Hibernate Toolsで自動生成したソースには

まだ若干不満があります。

アノテーションスキーマ名が指定されてしまうが

テストサーバーと本番サーバーでスキーマ名が違うので

ソースに入ってほしくない。

precision,scale,lengthがアノテーションで指定される。

指定するメリットもあるのですが、DBとの2重管理に

なる面もあります。


Hibernate Toolsはある程度カスタマイズできます。

1つはCustom Strategyというクラスを作る方法。

DelegatingReverseEngineeringStrategyを継承します。

DBのフィールド名からJavaの変数名に変換するロジック

などを独自のものに変えたりできます。

もう1つは、自動生成されるソースのテンプレートは

freemarkerでできているので、それをコピーして

書き換える方法です。


スキーマ名が入るのはテンプレートのカスタマイズで

対応できそうですが、precisionなどが入るのは

ソースをみたところカスタマイズできなさそうでした。


そこで、もうちょっとeasyな方法で、antで正規表現

ソースを書き換えます。

<replaceregexp byline="true">
<regexp pattern="正規表現" />
<substitution expression="置き換える文字列" />
<fileset file="ファイル名" />
</replaceregexp>

bylineは1行ずつ置換するかファイル全体を一気にやるかの

指定です。

ファイルは複数ファイルやディレクトリ指定などもできます。


これを使うときにbuild.xml全体がXMLであるために

いくつか注意点がありました。

・ダブルコーテーションの扱い

正規表現や置き換え文字列の中にダブルコーテーションを

入れたい場合、バックスラッシュをつける方法ではできません

でした。

&quot; と書くとできます。

・改行コード

正規表現のほうは\r\nでできますが、置き換え文字列のほうは

「rn」になってしまい、すごくがっかりします。

&#x0d;&#x0a; と指定するとできます。


その他にもいろいろカスタマイズしたいところがあり

最終的にはbuild.xmlはこんな具合になりました。

<project default="generate-model">
<property name="table" value="TBL_JUCHUU_BUNRUI" />
<property name="class" value="JuchuuBunrui" />
<property name="package" value="com.oisix.oisystemec.model" />
<property name="path-package" value="com/oisix/oisystemec/model" />
<property name="src" value="../src/${path-package}" />

<path id="toolslib">
<fileset dir="lib-plugin">
<include name="**/*.jar"/>
</fileset>
<path location="lib/ojdbc6.jar" />
</path>
<taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="toolslib" />

<target name="make-config">
<replaceregexp byline="true">
<regexp pattern="match-name=&quot;(.*)&quot;" />
<substitution expression="match-name=&quot;${table}&quot;" />
<fileset file="hibernate.reveng.xml" />
</replaceregexp>
<replaceregexp byline="true">
<regexp pattern="schema=&quot;TEST002&quot; name=&quot;(.*)&quot;" />
<substitution expression="schema=&quot;TEST002&quot; name=&quot;${table}&quot;" />
<fileset file="hibernate.reveng.xml" />
</replaceregexp>
<replaceregexp byline="true">
<regexp pattern="class=&quot;(.*)&quot;" />
<substitution expression="class=&quot;${package}.${class}&quot;" />
<fileset file="hibernate.reveng.xml" />
</replaceregexp>
</target>

<target name="generate" depends="make-config">
<hibernatetool destdir="generated">
<jdbcconfiguration configurationfile="lib/hibernate.cfg.test.xml" revengfile="hibernate.reveng.xml" detectmanytomany="false" detectOptimisticLock="false" />
<hbm2java jdk5="true" ejb3="true" />
</hibernatetool>
</target>

<target name="modify-model" depends="generate">
<replaceregexp byline="true">
<regexp pattern="package (.*);" />
<substitution expression="package \1.base;" />
<fileset file="generated/${path-package}/${class}.java" />
</replaceregexp>
<replaceregexp byline="true">
<regexp pattern="generated by hbm2java" />
<substitution expression="generated by hbm2java&#x0d;&#x0a; * DO NOT MODIFY, AUTO-GENERATION ONLY" />
<fileset file="generated/${path-package}/${class}.java" />
</replaceregexp>
<replaceregexp>
<regexp pattern="@Entity(\r\n|\n\r|\n|\r).*(\r\n|\n\r|\n|\r).*(\r\n|\n\r|\n|\r)\)" />
<substitution expression="@MappedSuperclass" />
<fileset file="generated/${path-package}/${class}.java" />
</replaceregexp>
<replaceregexp byline="true">
<regexp pattern="import javax.persistence.Entity;" />
<substitution expression="import javax.persistence.MappedSuperclass;" />
<fileset file="generated/${path-package}/${class}.java" />
</replaceregexp>
<replaceregexp>
<regexp pattern="import javax.persistence.Table;(\r\n|\n\r|\n|\r)" />
<substitution expression="" />
<fileset file="generated/${path-package}/${class}.java" />
</replaceregexp>
<replaceregexp byline="true">
<regexp pattern="implements java.io.Serializable \{" />
<substitution expression="implements java.io.Serializable {&#x0d;&#x0a; private static final long serialVersionUID = 1L;" />
<fileset file="generated/${path-package}/${class}.java" />
</replaceregexp>
<replaceregexp>
<regexp pattern="\s@Id\s*" />
<substitution expression="@Id&#x0d;&#x0a; " />
<fileset file="generated/${path-package}/${class}.java" />
</replaceregexp>
<replaceregexp>
<regexp pattern="\s@EmbeddedId\s*" />
<substitution expression="@EmbeddedId&#x0d;&#x0a; " />
<fileset file="generated/${path-package}/${class}.java" />
</replaceregexp>
<replaceregexp byline="true">
<regexp pattern=", precision=[0-9]+" />
<substitution expression="" />
<fileset file="generated/${path-package}/${class}.java" />
</replaceregexp>
<replaceregexp byline="true">
<regexp pattern=", scale=[0-9]+" />
<substitution expression="" />
<fileset file="generated/${path-package}/${class}.java" />
</replaceregexp>
<replaceregexp byline="true">
<regexp pattern=", length=[0-9]+" />
<substitution expression="" />
<fileset file="generated/${path-package}/${class}.java" />
</replaceregexp>
<replaceregexp byline="true">
<regexp pattern="public class " />
<substitution expression="public abstract class Abstract" />
<fileset file="generated/${path-package}/${class}.java" />
</replaceregexp>
<replaceregexp byline="true">
<regexp pattern="public ${class}\(" />
<substitution expression="public Abstract${class}(" />
<fileset file="generated/${path-package}/${class}.java" />
</replaceregexp>
<move file="generated/${path-package}/${class}.java" tofile="${src}/base/Abstract${class}.java" />
<move file="generated/${path-package}/${class}Id.java" todir="${src}" failonerror="false" />
<available file="${src}/${class}.java" property="file.exists"></available>
</target>

<target name="generate-model" depends="modify-model" unless="file.exists">
<echo message="generate class file"></echo>
<echo file="${src}/${class}.java">package ${package};

import javax.persistence.Entity;
import javax.persistence.Table;
import com.oisix.oisystemec.model.base.Abstract${class};

@Entity
@Table(name="${table}")
public class ${class} extends Abstract${class} {

private static final long serialVersionUID = 1L;

}
</echo>
</target>
</project>