Hibernate Toolで自動生成

Hibernateマッピングファイルやエンティティクラスを自動生成する為のツールのHibernate Toolに関して、
現在、JbossToolsに統合されています。
downloadできるのは、EclipseのIDEのみ?となっている模様ですが、
実は、IDEのpluginの中に、hibernate ToolのJARファイルがあります。
それを使って、Antでhibernate Toolを使うことが可能です。
ますAntを実行するbuild.xmlbuild.xmlの設定ファイルのbuild.propertiesを作成します。

build.propertiesファイル作成
# Library Directory
build.lib.dir=lib
# Generate Directory
generate.dir=generate
# Generate Source Directory
generate.src.dir=generate/src
# Generaqte hbmxml Directory
generate.hbmxml.dir=generate/hbmxml
# Generate Config Directory 
generate.conf.dir=generate/conf
# Directory Package Name
generate.package=jp.co.yahoo.system.developer
build.xmlファイル作成

まず上記の設定ファイルをbuild.xmlから使えるようにします。

<property file="build.properties"/>

次にhibernate Toolのタスクを定義します。
hibernate Toolのタスクを定義するには、ライブラリへのクラスパスを通す必要があります。
定義方法は、下記のように定義します。

<taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" >
  <classpath>
    <fileset dir="${build.lib.dir}">
      <include name="*.jar"/>
    </fileset>
  </classpath>
</taskdef>

こでHibernate ToolをAntで利用可能になるので、
マッピングファイルを生成するタスクを追加します。

<target name="hbm2hbmxml">
  <hibernatetool>
    <jdbcconfiguration
      configurationfile="${generate.conf.dir}/hibernate.cfg.xml"
      packagename="${generate.package}"
      revengfile="${generate.conf.dir}/hibernate.reveng.xml"/>
      <hbm2hbmxml destdir="${generate.hbmxml.dir}"/>
  </hibernatetool>
</target>

次にエンティティクラスを生成するタスクを追加します。

<target name="hbm2java">
  <hibernatetool>
    <configuration
      configurationfile="${generate.conf.dir}/hibernate.cfg.xml">
      <fileset dir="${generate.hbmxml.dir}">
        <include name="**/*.hbm.xml"/>
      </fileset>
    </configuration>	
    <hbm2java destdir="${generate.src.dir}"/>
  </hibernatetool>
</target>

これでAntの準備は完了です。
Hibernateのhbmxmlやエンティティクラスを生成する為には、設定ファイルが必要になります。
hibernate.cfg.xmlhibernate.reveng.xmlの2つのファイルを作成します。

hibernate.cfg.xmlファイル

hibernate.cfg.xmlは、Databaseへの接続情報とキャッシュなどの設定を定義するファイルです。
今回は、接続情報のみ定義することにします。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.password">developer</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>
        <property name="hibernate.connection.username">developer</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
    </session-factory>
</hibernate-configuration>
hibernate.reveng.xml作成

hibernate.reveng.xmlは、生成するテーブル名を定義します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC 
"-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" >
<hibernate-reverse-engineering>
  <table-filter match-name="CONTENT_DEF"/>
</hibernate-reverse-engineering>

それとjdbcTypeとhibernateTypeの変換ルールを変更したい場合は、上記に下記の内容を追記すると変更できるようになっています。

<hibernate-reverse-engineering>
  <type-mapping>
   <sql-type jdbc-type="CLOB" hibernate-type="java.lang.String"/>
   <sql-type jdbc-type="VARCHAR" hibernate-type="java.lang.String"/>
    .......
  </type-mapping>
  ......

これで、完了です。
後は、Antを実行すればhbmxmlファイルとエンティティクラスを生成することができます。
それと実は、DAOも生成させることができるのですが、ちょっとSpringとか一緒に使う場合など生成したものでは、ほぼ使えなかったりします。
DAOに関しては、HibernateToolを拡張しないと組み合わせるフレームワークによりDAOを生成したものをそのまま使うことができないかもしれません。
現状、拡張してDAOの生成を行っているのですが、それについては、また、別で書こうかと思います。
ちなみにデフォルトだと下記のAntタスクにDAOを生成する部分を追記すればDAOを生成できます。

<target name="hbm2java">
  <hibernatetool>
    <configuration
      configurationfile="${generate.conf.dir}/hibernate.cfg.xml">
      <fileset dir="${generate.hbmxml.dir}">
        <include name="**/*.hbm.xml"/>
      </fileset>
    </configuration>	
    <hbm2java destdir="${generate.src.dir}"/>
    <hbm2dao destdir="${generate.src.dir}"/> ← これを追加する。
  </hibernatetool>
</target>

但し、クラス名がなぜか?DAOなのに〜Homeとなっています。
ぱっと見でDAOクラスかわからない!ですけど…。
SpringのHibernateDaoSupportとかを使う場合は、このままでは使えないです。
手を加える必要があるのですが、自動生成したものに手を加えるのは余りよろしくないかなと思います。
ジェネレーションギャップパターンを適用できるように検討した方がいいでしょう。
その部分に関しても別で書こうかと思います。