Hibernate.org Community Documentation

- 前のページ
- 次のページ

## 第22章 ツールセットガイド

Hibernate を使ったラウンドトリップエンジニアリングは、 Eclipse プラグインやコマンドラインツール、もちろん Ant タスクを使うことで可能です。

Hibernate Tools は現在、既存データベースのリバースエンジニアリングの Ant タスクに加えて、 Eclipse IDE のプラグインを含みます:

- マッピングエディタ: Hibernate の XML マッピングファイル用のエディタで、自動補完と構文強調表示をサポートしています。クラス名やプロパティ/フィールド名に対する自動補完もサポートし、通常の XML エディタよりも強力です。

- Console: コンソールはエクリプスの新しいビューです。コンソールコンフィギュレーションのツリーオーバービューに加えて、永続クラスとその関連の相互作用ビューも得られます。データベースに HQL を実行し、結果を直接エクリプス上で見ることができます。

- 開発ウィザード Hibernate の Eclipse ツールはいくつかのウィザードを提供します。ウィザードを使って Hibernate の設定ファイル (cfg.xml) をすばやく生成したり、既存のデータベーススキーマを POJO のソースファイルと Hibernate のマッピングファイルへと、完全にリバースエンジニアリングすることができます。リバースエンジニアリングウィザードはカスタマイズ可能なテンプレートをサポートします。

より詳しい情報は Hibernate Tools パッケージとそのドキュメントを参照してください。

しかし、 Hibernate のメインパッケージは SchemaExport 、別名 `hbm2ddl` も含みます(Hibernate 「内」でオンザフライで使用できます)。

## 22.1. スキーマの自動生成

DDL は Hibernate ユーティリティによりマッピングファイルから生成することができます。生成されたスキーマはエンティティやコレクションのテーブルに対する参照整合性制約 (主キーと外部キー) を含みます。テーブルとシーケンスはマッピングする識別子ジェネレータに対して生成されます。

DDL はベンダー依存なので、このツールを使うときは、 `hibernate.dialect` プロパティで SQL の `方言` を指定 しなければなりません 。

まず、生成されるスキーマを改善するように、マッピングファイルをカスタマイズしてください。

### 22.1.1. スキーマのカスタマイズ

多くの Hibernate のマッピング要素では、オプションの `length`、 `precision`、 `scale` という名の属性を定義しています。この属性でカラムの長さ、精度、スケールを設定することができます。

    <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` 属性はカラムをグループ化して一つのキー制約にするために使われます。現在、 `unique-key` 属性で指定された値は制約の指定には 使われず 、マッピングファイルでカラムをグループ化することにのみ使われます。

    <many-to-one name="org" column="orgId" unique-key="OrgEmployeeId"/>

    <property name="employeeId" unique-key="OrgEmployee"/>

`index` 属性はマッピングするカラムを使って生成したインデックスの名前を指定します。複数カラムを１つのインデックスにグループ化できます。単に、同じインデックス名を指定するだけです。

    <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

    >

The following table summarizes these optional attributes.

表22.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 table` や `comment on column` 文が書かれます。

### 22.1.2. ツールの実行

`SchemaExport` は標準出力に対して DDL スクリプトを書き出し、 DDL 文を実行したりもします。

The following table displays the `SchemaExport` command line options

`java -cp` hibernate_classpaths `org.hibernate.tool.hbm2ddl.SchemaExport` options mapping_files

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

オプション | 説明
--- | ---
`--quiet` | 標準出力にスクリプトを出力しません
`--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);

### 22.1.3. プロパティ

次のように、データベースのプロパティを指定することができます。

- `-D`<property> を使って、システムプロパティとして

- `hibernate.properties` ファイル内で

- `--properties` を使って指定したプロパティファイル内で

必要なプロパティは以下のものです：

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

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

### 22.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

    >

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

`SchemaUpdate` ツールは既存のスキーマをインクリメンタルに更新します。 `SchemaUpdate` は JDBC のメタデータ API に強く依存します。そのため、すべての JDBC ドライバでうまくいくとは限らないことに注意してください。

`java -cp` hibernate_classpaths `org.hibernate.tool.hbm2ddl.SchemaUpdate` options mapping_files

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

オプション | 説明
--- | ---
`--quiet` | 標準出力にスクリプトを出力しません
`--text` | データベースにスクリプトをエクスポートしません
`--naming=eg.MyNamingStrategy` | `NamingStrategy` を選択
`--properties=hibernate.properties` | ファイルからデータベースのプロパティを読み込みます
`--config=hibernate.cfg.xml` | `.cfg.xml` ファイルを指定

アプリケーションに `SchemaUpdate` を組み込むことができます：

    Configuration cfg = ....;

    new SchemaUpdate(cfg).execute(false);

### 22.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

    >

### 22.1.7. Schema validation

`SchemaValidator` ツールは、既存のデータベーススキーマと作成したマッピングドキュメントが「一致する」ことを検証します。 `SchemaValidator` は JDBC のメタデータ API に強く依存することに注意してください。そのため、すべての JDBC ドライバーで作動するものではありません。このツールはテスト時に非常に有用です。

`java -cp` hibernate_classpaths `org.hibernate.tool.hbm2ddl.SchemaValidator` options mapping_files

The following table displays the `SchemaValidator` command line options:

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

オプション | 説明
--- | ---
`--naming=eg.MyNamingStrategy` | `NamingStrategy` を選択
`--properties=hibernate.properties` | ファイルからデータベースのプロパティを読み込みます
`--config=hibernate.cfg.xml` | `.cfg.xml` ファイルを指定

`SchemaValidator` をアプリケーションに組み込むことが出来ます:

    Configuration cfg = ....;

    new SchemaValidator(cfg).validate();

### 22.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

    >

製作著作 © 2004 Red Hat, Inc.

- 前のページ第21章 パフォーマンスの改善
- 上に戻る
- ホーム
- 次のページ第23章 Additional modules