你好 我正在使用每个类层次结构的一个表继承映射到遗留数据,如此处所述
这是我的映射大致的样子
<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>
每个order id可以有很多notes子类
注释被描述为订单类中的关联,例如
<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"作为鉴别器定义的一部分
我还可以在通过来自 session 工厂的 hibernate session 的 DAO 调用中使用 HQL “来自 RefundNote,其中 orderId =?” 或者 “来自 Note note where note.class = RefundNote and orderId =?”获取正确的 RefundNote 子类列表,并使用 refundNotes 上的 setter 将列表填充到 Order 类中。
所有标准的 hibernate 内容?
这些方法中的任何一种都会创建集合,向同一个表发出 3 个查询(每个集合一个)。随着子类数量的增加,这似乎效率低下......?
我读了很多书,但看不到 hibernate (通过获取策略、连接、子选择等)有什么方法可以将这些调用最小化为单个数据库调用并仍然填充我的集合......?
我可以获取所有笔记并在 Java 中迭代以通过 class.simpleName 检查构建集合,但想知道我是否遗漏了一些 hibernate 会做的事情......?
谢谢你的建议
最佳答案
我必须深入研究代码才能验证,但我怀疑这就是 Hibernate 处理这样的映射关联的方式——它总是会为每个水化关联调用一个数据库。
另一种方法是有一个映射的 hibernate 集合,Notes,然后有用于 refundNotes 等的 transient 字段。
在特定类型的 getter 中,遍历笔记集合以查找感兴趣的特定笔记。在您的 setter 中,将其添加到一般笔记集合中。
这样,hibernate 将进行单一查询以获取笔记,并且您可以根据需要对水合对象进行操作。
关于java - 每个类层次结构继承使用一个表时的 hibernate 获取策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6035766/