DB2用のHibernateカスタムDialect作成

HibernateのカスタムDialect

 DB2用にHibernateのSQLのカスタムDialectを作成したので、作成方法をご紹介します。HibernateなどのORマッパーを使用してDB操作する場合、開発者は接続用のDBに合わせて、使用するSQLのDialectを指定するだけ、というケースがほとんどだと思います。
 ただ今回は、下記の事情からDialectをカスタマイズすることになりました。

事情1.今回は、EntityクラスからDDLを生成していた
事情2.文字列データ型としてDB2のVARGRAPHICを使うことにした
 (HibernateのデフォルトのDialectだとJavaのStringをVARCHARに変換します。)
事情3.開発環境ではH2を使用していたため、Entityクラスのアノテーションで直接データ型指定ができなかった

 事情3について補足すると、文字列データ型のVARGRAPHICを指定する方法としては、Entityクラスに直接指定する方法もあるのですが、そうすると開発環境で使用しているH2にはないデータ型になってしまうので、この方法は使えません。

 HibernateがEntityクラス(Javaのソースコード)からDDLを生成するタイミングで各DB用のDialectが言語の型を、DB専用のデータ型に変換します。ここにカスタムDialectを作成することで、開発環境ではH2を使いつつ、本番環境ではDB2を利用することも可能となります。今回は、DB2Dialectのデフォルトの動作を変更し、JavaのStringをDB2のVARCHARに変換するところを、VARGRAPHICに変換するようにカスタムDialectを作成しました。

Dialectの作成方法/設定方法

・作成するクラス:
 下記の2つのクラスを継承したクラス
 org.hibernate.dialect.DB2Dialect
 org.hibernate.dialect.unique.DB2UniqueDelegate


・設定箇所:
 Dialectを指定している設定ファイルも変更する必要があります。
 hibernate.dialect:<パッケージ名>.CustomDB2Dialect
 (Hibernateのプロパティです。設定ファイルは、様々な種類があるので割愛しています。)

これで、Hibernateがスキーマを自動生成するときにStringに対応するDBのデータ型がVARGRAPHICになります。

所感

 地味な機能ですが、必要なケースは意外とありそうだなというのが作ってみての感想です。
 今回はデータ型のマッピングのみの修正でしたが、Dialectを修正すると実行時の値の変換などもカスタマイズできます。例えば、DB2のデータ型には、真偽値がありません。Javaのbooleanは、DB2のsmallintになり、trueは数値の1、falseは数値の0に変換されます。これも裏でDialectが密かにやっていることです。

Hibernate(4.2)のDialectに関しては、下記に情報がありますので参考にしてください。
http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch01.html#configuring-dialects


Leave a Reply

Popular Posts