【问题标题】:Best way to override Hibernate's lazy loading in this instance在这种情况下覆盖 Hibernate 延迟加载的最佳方法
【发布时间】:2010-02-14 20:14:25
【问题描述】:

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

您有一个类 A,其属性为 b,属于类 B。每当您加载 A 类型的实体时,您都希望非延迟加载完整的 a.b.c 链。

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

编辑:
也可以使用作为 SQL 表达式的 formula 定义属性。文档说:

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

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

如果它是一个返回 Hibernate 对象的 Hibernate 查询,这将起作用。

编辑 2:
其他想法包括声明一个类B2,它与B 完全相同,只是它的C 属性不是延迟加载的。

目前的选项是

  1. 按照 skaffman 的建议,每次都依赖查询。
  2. 在属性中使用公式来获取我想要的字段,但没有对象。
  3. 使用非惰性b.c 创建一个B2 类。 (有点丑)。

【问题讨论】:

    标签: hibernate lazy-loading


    【解决方案1】:

    如果这在您的应用中不常见(而且不应该如此),您可以在获取 A 对象后手动初始化依赖对象,使用 Hibernate.initialize(..)

    【讨论】:

      【解决方案2】:

      使用 HQL,如下所示:

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

      【讨论】:

      • 对于很好的查询。但是,如果我遍历另一个对象的 .a 属性,我不会一次获得 a.b.c
      • 确实如此,但是如果您将B.c 配置为延迟加载,那么它的行为方式就是这样。如果要覆盖它,则需要编写查询以显式获取它。
      猜你喜欢
      • 2019-04-27
      • 2023-03-31
      • 2014-07-07
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多