每个类层次结构继承使用一个表时的hibernate获取策略

时间:2011-05-17 19:01:50

标签: java hibernate

您好 我正在使用每个类层次结构继承映射到遗留数据的一个表,如此处所述

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/inheritance.html#inheritance-tableperclass

这是我的映射大致看起来像

<class abstract="true" name="note" table="NOTES">
 <id name="id" type="long" column="NOTE_ID">
     <generator class="native"/>
 </id>
 <discriminator column="NOTE_TYPE" type="string"/>
 <property name="orderId" column="ORDER_ID"/>
 <property name="text" column="TEXT"/>
 <subclass name="PurchaseNote" discriminator-value="PUR" />
 <subclass name="CancelNote" discriminator-value="CAN" />
 <subclass name="RefundNote" discriminator-value="REF" />
</class>

每个订单ID可以有许多备注子类

Notes被描述为Order Class中的关联,如

<class name="order" table="ORDERS">
 <id name="id" type="long" column="ORDER_ID">
     <generator class="native"/>
 </id>
 .....
<set name="purchaseNotes">
    <key column="orderId" />
    <one-to-many class="PurchaseNote"/>
</set>
<set name="cancelNotes">
    <key column="orderId" />
    <one-to-many class="cancelNote"/>
</set>
<set name="refundNotes">
    <key column="orderId" />
    <one-to-many class="refundNote"/>
</set>

</class>

如果我执行以下操作,我可以获取由hibernate提取的关联集合。

1)在xml的顺序中使用set定义中的“Where”子句 要么 2)使用force =“true”作为notes xml

中鉴别器定义的一部分

我还可以在通过会话工厂的hibernate会话调用DAO时使用HQL “来自RefundNote,orderId =?” 要么 “来自Note note,其中note.class = RefundNote和orderId =?”获取正确的RefundNote子类列表,并使用refundNotes上的setter填充Order类中的列表。

所有标准的hibernate东西?

这些方法中的任何一个都会创建集合,向同一个表触发3个查询(每个集合一个)。随着子类数量的增长,这似乎是无效的......?

我已经阅读了很多但是看不到任何方式hibernate(通过获取策略,加入,子选择等)可以最小化这些对单个db调用的调用并仍然填充我的集合.....?

我可以通过class.simpleName检查得到所有注释并在Java中迭代以构建集合但是想知道我是否遗漏了hibernate会做什么.....?

感谢您的任何建议

1 个答案:

答案 0 :(得分:0)

我必须深入研究代码以进行验证,但我怀疑这只是Hibernate如何处理这样的映射关联 - 它总是会为每个水合关联进行一次数据库调用。

另一种方法是使用一个映射的hibernate集合,Notes,然后为recoverNotes等提供瞬态字段。

在针对特定类型的getter中,遍历notes集合以查找感兴趣的特定注释。在您的setter中,将它添加到常规备注集合中。

这样,hibernate将使单个查询获取注释,并且您可以根据需要对水合对象进行操作。