【发布时间】:2011-05-17 19:01:49
【问题描述】:
你好 我正在使用每个类层次结构继承映射到遗留数据的一个表,如此处所述
这是我的映射大致的样子
<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) 在集合定义中按 xml 顺序使用“Where”子句 或者 2) 在注释 xml 中使用 force="true" 作为鉴别器定义的一部分
我还可以在通过会话工厂的休眠会话进行的 DAO 调用中使用 HQL “来自 RefundNote,其中 orderId = ?” 或者 “来自 Note note.class= RefundNote 和 orderId = ?”获取正确的 RefundNote 子类的列表,并使用refundNotes 上的setter 填充Order 类中的列表。
所有标准的休眠内容?
这些方法中的任何一种都会创建向同一个表触发 3 个查询(每个集合一个)的集合。随着子类数量的增加,这似乎效率低下......?
我读过很多书,但看不到任何休眠方式(通过获取策略、加入、子选择等)可以最大限度地减少对单个数据库调用的这些调用并仍然填充我的集合.....?
我可以通过 class.simpleName 检查获取所有注释并在 Java 中迭代以构建集合,但我想知道我是否遗漏了一些 hibernate 会做的事情.....?
感谢您的建议
【问题讨论】: