第20章 ツールセットガイド

Hibernate を使ったラウンドトリップエンジニアリングは、Eclipse プラグインやコマンドラインツール、Ant タスクを使うことで可能です。
Hibernate Tools は現在、既存データベースのリバースエンジニアリングの Ant タスクに加えて、Eclipse IDE のプラグインを含みます:
  • マッピングエディタ: Hibernate の XML マッピングファイル用のエディタで、自動補完と構文強調表示をサポートしています。クラス名やプロパティ/フィールド名に対する自動補完もサポートし、通常の XML エディタよりも強力です。
  • Console: コンソールはEclipseの新しいビューです。コンソール構成のツリーの全体図に加えて、永続クラスとその関連の相互作用ビューも得られます。データベースに HQL を実行し、結果を直接Eclipse上で見ることができます。
  • 開発ウィザード Hibernate の Eclipse ツールはいくつかのウィザードを提供します。ウィザードを使って Hibernate の設定ファイル (cfg.xml) をすばやく生成し、あるいは、既存のデータベーススキーマを POJO のソースファイルと Hibernate のマッピングファイルへと、完全にリバースエンジニアリングすることができます。リバースエンジニアリングウィザードはカスタマイズ可能なテンプレートをサポートします。
より詳しい情報は Hibernate Tools パッケージドキュメントを参照してください。
しかし、 Hibernate のメインパッケージは SchemaExport 、別名 hbm2ddl という統合ツールも同梱しています。Hibernate 「内」でも使用できます。

20.1. スキーマの自動生成

DDL は Hibernate ユーティリティによりマッピングファイルから生成することができます。生成されたスキーマはエンティティやコレクションのテーブルに対する参照整合性制約、主キー、外部キーを含みます。テーブルとシーケンスはマッピングされた識別子ジェネレータに対しても生成されます。
DDL は非常にベンダーに依存しており、このツールを使うときは、hibernate.dialect プロパティで SQL の 方言 を指定 しなければなりません
まず、生成されるスキーマを改善するように、マッピングファイルをカスタマイズしてください。次の章でスキーマのカスタマイズについて説明します。

20.1.1. スキーマのカスタマイズ

多くの Hibernate のマッピング要素では、lengthprecisionscale という名のオプション属性を定義しています。この属性でカラムの長さ、精度、スケールを設定することができます。
<property name="zip" length="5"/>
<property name="balance" precision="12" scale="2"/>
テーブルカラムに NOT NULL 制約を生成するnot-nullとテーブルカラムに UNIQUE 制約を生成する unique 属性を受け付けるタグもあります。
<many-to-one name="bar" column="barId" not-null="true"/>
<element column="serialNumber" type="long" not-null="true" unique="true"/>
unique-key 属性は、カラムを一意のキー制約1つにグループ化して使われます。現在、 unique-key 属性で指定された値は制約の指定には 使われず 、マッピングファイルでカラムをグループ化することにのみ使われます。
<many-to-one name="org" column="orgId" unique-key="OrgEmployeeId"/>
<property name="employeeId" unique-key="OrgEmployee"/>
index 属性は、1つ以上のマッピングされたカラムを使って生成したインデックスの名前を指定します。複数カラムを1つのインデックスにグループ化できます。単に、同じインデックス名を指定するだけです。
<property name="lastName" index="CustName"/>
<property name="firstName" index="CustName"/>
foreign-key 属性は、生成外部キー制約の名前をオーバーライドするために使用できます。
<many-to-one name="bar" column="barId" foreign-key="FKFooBar"/>
多くのマッピング要素は、子 <column> 要素を記述できます。これは複数カラム型のマッピングには特に有用です:
<property name="name" type="my.customtypes.Name"/>
    <column name="last" not-null="true" index="bar_idx" length="30"/>
    <column name="first" not-null="true" index="bar_idx" length="20"/>
    <column name="initial"/>
</property>
default 属性はカラムのデフォルト値を指定します。マッピングしたクラスの新しいインスタンスを保存する前に、マッピングしたプロパティへ同じ値を代入する必要があります。
<property name="credits" type="integer" insert="false">
    <column name="credits" default="10"/>
</property>
<version name="version" type="integer" insert="false">
    <column name="version" default="0"/>
</property>
sql-type 属性で、デフォルトの Hibernate 型から SQL のデータ型へのマッピングをオーバーライドできます。
<property name="balance" type="float">
    <column name="balance" sql-type="decimal(13,3)"/>
</property>
check 属性でチェック制約を指定することができます。
<property name="foo" type="integer">
    <column name="foo" check="foo > 10"/>
</property>
<class name="Foo" table="foos" check="bar < 100.0">
    ...
    <property name="bar" type="float"/>
</class>
以下のテーブルにて、これらのオプション属性についてまとめています。

表20.1 要約

属性 説明
length 数値 カラムの長さ
precision 数値 カラムの DECIMAL 型の精度(precision)
scale 数値 カラムの DECIMAL 型のスケール(scale)
not-null true|false カラムが null 値を取らないことを指定します。
unique true|false カラムがユニーク制約を持つことを指定します
index index_name (複数カラムの)インデックスの名前を指定します
unique-key unique_key_name 複数カラムのユニーク制約の名前を指定します
foreign-key foreign_key_name <one-to-one><many-to-one><key>、 または <many-to-many> マッピングエレメントのために、関連に対して生成された外部キー制約の名前を指定します。 inverse="true" 側は SchemaExport によって考慮されないことに注意してください。
sql-type SQL column type デフォルトのカラム型をオーバーライドします ( <column> 要素の属性に限る)
default SQL 式 カラムのデフォルト値を指定します
check SQL 式 カラムかテーブルに SQL のチェック制約を作成します
<comment> 要素で生成するスキーマにコメントを指定することができます。
<class name="Customer" table="CurCust">
    <comment>Current customers only</comment>
    ...
</class>
<property name="balance">
    <column name="bal">
        <comment>Balance in USD</comment>
    </column>
</property>
これにより、対応している場合、生成した DDL に comment on tablecomment on column 文が書かれます。

20.1.2. ツールの実行

SchemaExport は標準出力に対して DDL スクリプトを書き出し、 DDL 文を実行したりもします。
以下の表で、SchemaExport のコマンドラインオプションを示しています。
java -cp hibernate_classpaths org.hibernate.tool.hbm2ddl.SchemaExport options mapping_files

表20.2 SchemaExport のコマンドラインオプション

オプション 説明
--quiet 標準出力(stdout)にスクリプトを出力しません
--drop テーブルの削除だけを行います
--create テーブルの生成のみを行います
--text データベースにエクスポートしません
--output=my_schema.ddl DDL スクリプトをファイルに出力します
--naming=eg.MyNamingStrategy NamingStrategy を選択
--config=hibernate.cfg.xml XML ファイルから Hibernate の定義情報を読み込みます
--properties=hibernate.properties ファイルからデータベースのプロパティを読み込みます
--format スクリプト内に生成する SQL を読みやすいようにフォーマットします
--delimiter=; スクリプトの行区切り文字を設定します
アプリケーションに SchemaExport を組み込むこともできます:
Configuration cfg = ....;
new SchemaExport(cfg).create(false, true);

20.1.3. プロパティ

データベースのプロパティを指定することができます:
  • -D<property> を使って、システムプロパティとして
  • hibernate.properties ファイル内で
  • --properties を使って指定したプロパティファイル内で
必要なプロパティは以下のものです:

表20.3 SchemaExport コネクションプロパティ

プロパティ名 説明
hibernate.connection.driver_class jdbc のドライバークラス
hibernate.connection.url jdbc の url
hibernate.connection.username データベースのユーザー
hibernate.connection.password ユーザーパスワード
hibernate.dialect データベース方言

20.1.4. Ant を使用する

Ant のビルドスクリプトから SchemaExport を呼び出すことができます:
<target name="schemaexport">
    <taskdef name="schemaexport"
        classname="org.hibernate.tool.hbm2ddl.SchemaExportTask"
        classpathref="class.path"/>
    
    <schemaexport
        properties="hibernate.properties"
        quiet="no"
        text="no"
        drop="no"
        delimiter=";"
        output="schema-export.sql">
        <fileset dir="src">
            <include name="**/*.hbm.xml"/>
        </fileset>
    </schemaexport>
</target>

20.1.5. インクリメンタルなスキーマ更新

SchemaUpdate ツールは既存のスキーマを「インクリメンタル」に更新します。SchemaUpdate は JDBC のメタデータ API に依存します。そのため、すべての JDBC ドライバで正常に機能するとは限りません。
java -cp hibernate_classpaths org.hibernate.tool.hbm2ddl.SchemaUpdate options mapping_files

表20.4 SchemaUpdate のコマンドラインオプション

オプション 説明
--quiet 標準出力(stdout)にスクリプトを出力しません
--text データベースにスクリプトをエクスポートしません
--naming=eg.MyNamingStrategy NamingStrategy を選択
--properties=hibernate.properties ファイルからデータベースのプロパティを読み込みます
--config=hibernate.cfg.xml .cfg.xml ファイルを指定
アプリケーションに SchemaUpdate を組み込むことができます:
Configuration cfg = ....;
new SchemaUpdate(cfg).execute(false);

20.1.6. インクリメンタルなスキーマ更新に対する Ant の使用

Ant スクリプトから SchemaUpdate を呼び出すことができます:
<target name="schemaupdate">
    <taskdef name="schemaupdate"
        classname="org.hibernate.tool.hbm2ddl.SchemaUpdateTask"
        classpathref="class.path"/>
    
    <schemaupdate
        properties="hibernate.properties"
        quiet="no">
        <fileset dir="src">
            <include name="**/*.hbm.xml"/>
        </fileset>
    </schemaupdate>
</target>

20.1.7. スキーマバリデーション

SchemaValidator ツールは、既存のデータベーススキーマとマッピングドキュメントが「一致する」ことを検証します。 SchemaValidator は JDBC のメタデータ API に強く依存します。そのため、すべての JDBC ドライバーで作動するものではありません。このツールはテスト時に非常に有用です。
java -cp hibernate_classpaths org.hibernate.tool.hbm2ddl.SchemaValidator options mapping_files
以下の表で、SchemaValidator のコマンドラインオプションを示しています。

表20.5 SchemaValidator のコマンドラインオプション

オプション 説明
--naming=eg.MyNamingStrategy NamingStrategy を選択
--properties=hibernate.properties ファイルからデータベースのプロパティを読み込みます
--config=hibernate.cfg.xml .cfg.xml ファイルを指定
SchemaValidator をアプリケーションに組み込むことが出来ます:
Configuration cfg = ....;
new SchemaValidator(cfg).validate();

20.1.8. スキーマのバリデーションに Ant を使用

Ant スクリプトから SchemaValidator を呼び出せます:
<target name="schemavalidate">
    <taskdef name="schemavalidator"
        classname="org.hibernate.tool.hbm2ddl.SchemaValidatorTask"
        classpathref="class.path"/>
    
    <schemavalidator
        properties="hibernate.properties">
        <fileset dir="src">
            <include name="**/*.hbm.xml"/>
        </fileset>
    </schemavalidator>
</target>