Hibernate 4.0 (おそらくそれ以前) では、table-per-hierarchy モデルを使用している場合、ネストされた要素を使用できます。
クラス構造の例:
Word (has property "text", string)
- Subject (adds property "plural", boolean)
- Pronoun (adds property "masculine", boolean)
- ProperNoun (adds property "person", boolean)
- Verb (adds property "past_tense", boolean)
Hibernate マッピング XML の例:
<class name="test.Word" table="words">
<id name="id"><generator class="native"/></id>
<discriminator column="word_type" type="string"/>
<property name="text"/>
<subclass name="test.Subject">
<property name="plural"/>
<subclass name="test.ProperNoun">
<property name="person"/>
</subclass>
<subclass name="test.Pronoun">
<property name="masculine"/>
</subclass>
</subclass>
<subclass name="test.Verb">
<property name="past_tense"/>
</subclass>
</class>
次に、次のコードを実行した後 (クラス コードは省きました。これは非常に基本的なものであり、正直なところ、この例ではオブジェクトの型自体だけが重要です)。
HibernateUtil.beginTransaction();
HibernateUtil.getCurrentSession().persist(new Word("blue"));
HibernateUtil.getCurrentSession().persist(new Subject("chairs", true));
HibernateUtil.getCurrentSession().persist(new ProperNoun("James", true));
HibernateUtil.getCurrentSession().persist(new Pronoun("he", false, true));
HibernateUtil.getCurrentSession().persist(new Verb("sat", true));
HibernateUtil.commitTransaction();
データベースには、最終的に次の情報が含まれます。
id, word_type, text, plural, person, masculine, past_tense,
1, test.Word, blue, NULL, NULL, NULL, NULL
2, test.Subject, chairs, 1, NULL, NULL, NULL
3, test.ProperNoun, James, 0, 1, NULL, NULL
4, test.Pronoun, he, 0, NULL, 1, NULL
5, test.Verb, sat, NULL, NULL, NULL, 1
そして、オブジェクトのリストを照会すると、適切な型が返されます。
HibernateUtil.beginTransaction();
List<Word> words = HibernateUtil.getCurrentSession().createCriteria(Word.class).list();
for (Word w:words)
System.out.println(w);
HibernateUtil.commitTransaction();
版画:
test.Word@caf6c1
test.Subject@10e35d5
test.ProperNoun@18e8541
test.Pronoun@1ce85c4
test.Verb@17aece8
http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/inheritance.htmlのセクション 10.1.1 を参照してください(基本的に古いドキュメントと同じですが)。ネストされたサブクラスが許可されていることを明確に示していませんが、実験するのは簡単です。
Hibernate のドキュメントが非常によく整理されていないことに同意します。すべてがそこにありますが、それが整理されている方法に関する何かが、完全な情報を見つけるのを非常に困難にしていることに気づきました。ほとんどの場合、相互参照の過度の使用と、すべてのベースを常にカバーしているとは限らないユースケース指向のレイアウトが原因です。ただし、情報はあります。