開発者が独自の値型を作成することは、比較的簡単です。例えば、 java.lang.BigInteger 型のプロパティを VARCHAR カラムに永続化したいかもしれません。 Hibernate はこのための組み込み型を用意していません。しかしカスタム型は、プロパティ(またはコレクションの要素)を1つのテーブルカラムにマッピングするのに制限はありません。そのため例えば、 java.lang.String 型の getName() / setName() Java プロパティを FIRST_NAME 、 INITIAL 、 SURNAME カラムに永続化できます。
カスタム型を実装するには、 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つは抽象化です。カスタム型を使うことで、通貨をどのように表現しようともマッピングドキュメントは起こりうる変化に対応できます。