前述したように、 Hibernate はまずクラスパス内で DTD を解決しようとします。 org.xml.sax.EntityResolver のカスタム実装を XML ファイルを読み込むための SAXReader に登録することによって、 DTD を解決します。このカスタムの EntityResolver は2つの異なるシステム ID 名前空間を認識します。
hibernate namespace は、リゾルバが http://hibernate.sourceforge.net/ で始まるシステム ID に到達したときに認識されます。そしてリゾルバは、 Hibernate のクラスをロードしたクラスローダを用いて、これらのエンティティを解決しようとします。
user namespace は、リゾルバが URL プロトコルの classpath:// を使ったシステム ID に到達したときに、認識されます。そしてリゾルバは、 (1) カレントスレッドのコンテキストクラスローダー、または (2) Hibernate のクラスをロードしたクラスローダを使って、これらのエンティティを解決しようとします。
下記は、ユーザー名前空間を使った例です:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" [
<!ENTITY types SYSTEM "classpath://your/domain/types.xml">
]>
<hibernate-mapping package="your.domain">
<class name="MyEntity">
<id name="id" type="my-custom-id-type">
...
</id>
</class>
& types;
</hibernate-mapping>
ここで types.xml は your.domain パッケージ内のリソースであり、カスタム 項5.2.3. 「カスタム型」 を含みます。