Red Hat Training
A Red Hat training course is available for Red Hat JBoss Web Server
6.2.3. カスタム型
開発者が独自の値型を作成することは、比較的簡単です。例えば、
java.lang.BigInteger
型のプロパティを VARCHAR
カラムに永続化したいとします。Hibernate はこのための組み込み型を用意していません。しかしカスタム型は、プロパティ、またはコレクションの要素を1つのテーブルカラムにマッピングするのに制限はありません。そのため例えば、 FIRST_NAME
、 INITIAL
、SURNAME
カラムに永続化される、java.lang.String
型の getName()
/ setName()
Java プロパティを持つ場合があります。
カスタム型を実装するには、
org.hibernate.UserType
または org.hibernate.CompositeUserType
を実装し、その型の完全修飾された名前を使ってプロパティを宣言します。どのような種類のものが可能かを調べるには、org.hibernate.test.DoubleStringType
を確認してください。
<property name="twoStrings" type="org.hibernate.test.DoubleStringType"> <column name="first_string"/> <column name="second_string"/> </property>
<column>
タグで、プロパティを複数のカラムへマッピングできることに注目してください。
CompositeUserType
、 EnhancedUserType
、 UserCollectionType
、 UserVersionType
インターフェースは、より特殊な使用法に対してのサポートを提供します。
マッピングファイル内で
UserType
へもパラメータを提供できます。このためには、UserType
は org.hibernate.usertype.ParameterizedType
インターフェースを実装しなくてはなりません。 カスタム型パラメータを提供するために、マッピングファイル内で <type>
要素を使用できます。
<property name="priority"> <type name="com.mycompany.usertypes.DefaultValueIntegerType"> <param name="default">0</param> </type> </property>
UserType
は、引数として渡された Properties
オブジェクトから、 default
で指定したパラメータに対する値を検索することができます。
特定の
UserType
を定期的に使用する場合、短い名前を定義すると便利です。<typedef>
要素を使ってこのようなことが行えます。Typedefs はカスタム型に名前を割り当てます。そして、その型がパラメータを持つならば、パラメータのデフォルト値のリストを含むこともできます。
<typedef class="com.mycompany.usertypes.DefaultValueIntegerType" name="default_zero"> <param name="default">0</param> </typedef>
<property name="priority" type="default_zero"/>
プロパティのマッピングで型パラメータを使うことで、 typedef で提供されたパラメータをその都度オーバーライドすることが可能です。
Hibernate の幅広い組み込み型とコンポーネントに対するサポートは、カスタム型をめったに 使わない ということを意味します。それでもなお、アプリケーションで頻出するエンティティ以外のクラスに対するカスタム型の使用は、よいやり方であるとみなされます。例えば
MonetaryAmount
クラスはコンポーネントとして簡単にマッピングできますが、 CompositeUserType
の良い候補です。カスタム型を使用する理由の1つは抽象化です。カスタム型を使うことで、マッピングドキュメントは、通過値の表現方法 に変更があっても保護されます。