第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 のマッピング要素では、
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
属性は、カラムを一意のキー制約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 table
や comment 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>