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_NAMEINITIALSURNAME カラムに永続化される、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> タグで、プロパティを複数のカラムへマッピングできることに注目してください。
CompositeUserTypeEnhancedUserTypeUserCollectionTypeUserVersionType インターフェースは、より特殊な使用法に対してのサポートを提供します。
マッピングファイル内で UserType へもパラメータを提供できます。このためには、UserTypeorg.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つは抽象化です。カスタム型を使うことで、マッピングドキュメントは、通過値の表現方法 に変更があっても保護されます。