2010-02-14 53 views
1

假设您的类B带有延迟加载的属性c。并且除了以下内容,系统在任何地方都可以使用:覆盖Hibernate的延迟加载的最佳方法

您有一个类A,属性为B,属性为b。无论何时加载A类型的实体,您都希望非懒惰地加载完整的a.b.c链。

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

编辑:
的属性也可以用一个formula这是一个SQL表达式定义。该文档说:

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

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

,如果它是返回一个Hibernate对象的Hibernate查询这会工作。

编辑2:
其他想法包括声明一个类B2这是完全一样B除了它的C属性不延迟加载。

到目前为止,选项

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

回答

1

使用HQL,像这样:

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

对于那些很好的查询。但是如果我遍历另一个对象的'.a'属性,我就不会一次性获得'a.b.c'。 – z5h 2010-02-14 20:20:32

+0

这的确如此,但是如果你将'B.c'配置为延迟加载,那么这就是它的行为。如果你想覆盖它,那么你需要编写你的查询来显式获取它。 – skaffman 2010-02-14 20:31:54

2

如果这不是在您的应用程序一个共同的情况下(这不应该是),你可以手动初始化获取的A后的依赖对象对象,使用Hibernate.initialize(..)