【问题标题】:hibernate fetch strategy when using one table per class hierarchy inheritance每个类层次结构继承使用一个表时的休眠获取策略
【发布时间】:2011-05-17 19:01:49
【问题描述】:

你好 我正在使用每个类层次结构继承映射到遗留数据的一个表,如此处所述

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/inheritance.html#inheritance-tableperclass

这是我的映射大致的样子

<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 会做的事情.....?

感谢您的建议

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    我必须深入研究代码来验证,但我怀疑这只是 Hibernate 处理这样的映射关联的方式——它总是会为每个水合关联进行一次数据库调用。

    另一种方法是有一个映射的hibernate集合、Notes,然后有用于refundNotes等的瞬态字段。

    在特定类型的 getter 中,遍历笔记集合以查找感兴趣的特定笔记。在您的 setter 中,将其添加到常规笔记集合中。

    这样,hibernate 将进行单个查询来获取笔记,并且您可以根据需要对水合对象进行操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多