您好 我正在使用每个类层次结构继承映射到遗留数据的一个表,如此处所述
这是我的映射大致看起来像
<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会做什么.....?
感谢您的任何建议
答案 0 :(得分:0)
我必须深入研究代码以进行验证,但我怀疑这只是Hibernate如何处理这样的映射关联 - 它总是会为每个水合关联进行一次数据库调用。
另一种方法是使用一个映射的hibernate集合,Notes,然后为recoverNotes等提供瞬态字段。
在针对特定类型的getter中,遍历notes集合以查找感兴趣的特定注释。在您的setter中,将它添加到常规备注集合中。
这样,hibernate将使单个查询获取注释,并且您可以根据需要对水合对象进行操作。