使用一表映射整个继承层次结构时,Hibernate的提取策略

3

你好,我正在使用每个类层次结构一个表的继承映射方式来继承遗留数据,具体内容请参考这里

以下是我的大致映射内容:

<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可以有许多注释的子类。

这些注释在订单类中被描述为关联,类似于:

<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)在order xml中的set定义中使用"Where"子句 或者 2)在notes xml中作为鉴别器定义的一部分使用force="true"
我还可以通过从session factory调用hibernate session中的DAO使用HQL语句 "from RefundNote where orderId = ?" 或者 "from Note note where note.class = RefundNote and orderId = ?", 获取正确的RefundNote子类列表,并使用refundNotes上的setter方法填充Order类中的列表。
这些方法中的任何一个都会创建三个查询(每个集合一个)到同一个表。随着子类数量的增长,似乎效率不高....?
我已经阅读了很多资料,但是看不出Hibernate(通过提取策略、join、子选择等)如何最小化这些调用,同时仍然填充我的集合......?
我可以获取所有笔记并在Java中迭代来构建通过类.simpleName检查的集合,但是想知道是否错过了Hibernate会做的事情.....?
感谢任何建议
1个回答

0

我需要深入挖掘代码来验证,但我怀疑这只是Hibernate处理映射关联的方式 - 它总是会为每个已填充的关联进行一次数据库调用。

另一种方法是拥有一个映射的Hibernate集合,即Notes,然后拥有refundNotes等临时字段。

在您特定类型的getter中,迭代notes集合以查找感兴趣的特定注释。在setter中,将其添加到通用注释集合中。

这样,Hibernate将进行单个查询以获取注释,并且您可以根据需要操作已填充的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接