如何使用Hibernate嵌套子类?
例如,我有以下类层次结构:
PageElement
- PageParagraph
- PageImage
- PageVideo
- PageAudio
- PageQuestion
- PageFillInTheBlankQuestion
- PageOpenEndedQuestion
- PageMultipleChoiceQuestion
- ...
这是理想的对象结构。如何使用Hibernate成功映射?我会说PageQuestion
抽象类非常重要。它包含许多可重用的属性和逻辑。我还需要专门引用PageQuestion
而不引用PageElement
< - 这会很糟糕。我还想查询所有PageQuestion
个对象。
答案 0 :(得分:1)
在Hibernate 4.0(可能更早)中,如果使用的是每层次表模型,则可以使用嵌套元素。
示例类结构:
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文档的组织非常糟糕。一切都在那里,但我发现它的组织方式使我很难找到完整的信息;主要是由于过度使用交叉引用,以及面向用例的布局并不总是涵盖所有基础。但是,信息在那里。
答案 1 :(得分:0)
这正是Object和Relational范例之间的问题。
Hibernate就是这个的工具。你已经有了参考资料。
http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#d0e6906