你好,我正在使用每个类层次结构一个表的继承映射方式来继承遗留数据,具体内容请参考这里。
以下是我的大致映射内容:
<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会做的事情.....?
感谢任何建议