在这个实例中覆盖Hibernate的延迟加载的最佳方法

时间:2010-02-14 20:14:26

标签: hibernate lazy-loading

假设您有一个带有延迟加载属性B的类c。除了以下内容之外,这在系统的任何地方都很好:

您的课程A的课程b属性为B。每当您加载A类型的实体时,您都希望非懒惰地加载完整的a.b.c链。

有没有办法在Hibernate中设置这种类型的逻辑?

修改:
还可以使用formula(即SQL表达式)定义属性。文档说:

  

衍生出强大的功能   属性。这些属性是由   只读定义。该物业   值在加载时计算。您   将计算声明为SQL   表达。然后转换为a   SQL中的SELECT子句子查询   加载实例的查询:

<property name="totalPrice"
    formula="( SELECT SUM (li.quantity*p.price) FROM [...] )"/>

如果是返回Hibernate对象的Hibernate查询,这将有效。

编辑2:
其他想法包括声明类B2B完全相同,除了它的C属性不是延迟加载的。

到目前为止,选项是

  1. 每次都依赖于一个查询,正如skaffman所建议的那样。
  2. 在属性中使用公式来获取我想要的字段,但没有对象。
  3. 使用非懒惰B2创建b.c课程。 (有点丑陋)。

2 个答案:

答案 0 :(得分:2)

如果这不是您应用中的常见情况(并且不应该如此),您可以在使用Hibernate.initialize(..)

获取A对象后手动初始化从属对象

答案 1 :(得分:1)

使用HQL,如下所示:

from A as a
    inner join fetch a.b
    inner join fetch b.c