我正在开发一个项目,该项目具有丰富的对象模型和各种聚合根集。
我们正在使用Castle堆栈(通过 ActiveRecord 到 nHibernate 的 Monorail)。
我们已将聚合根标记为惰性[ActiveRecord(Lazy = true)]
,并在我们的存储库上自定义了“渴望”例程以渴望获取对象图。我们使用 HQL 从我们的根的子集合中定义渴望获取,
例如,如果Account
是聚合根(并标记为延迟加载),我们将急切地获取Account .. Order .. Product
实体以获得完整的图形。
所以到目前为止没有任何意外(希望如此)。
现在,如果在上面的示例中, Product 也被标记[ActiveRecord(Lazy = true)]
,这似乎停止了 HQL 中的 Eager fetch 指令。
有谁知道强制急切获取延迟加载的子对象的方法?
干杯伊恩
更新:
好的,这里有一些示例 hql,使用下面 'me.yahoo.com/../1' 中的示例,我们在获取多对多关系时使用 IMuliQuery 来解决 N+1 依赖关系。我们还明确地使用了多对多映射类。因此,我们的 hql 是:
from Account a 'm eager loading the graph
inner join fetch a.AccountsOrders ao
inner join fetch ao.Order
from Account a 'm eager loading the graph
inner join fetch a.AccountAddresses aa
inner join fetch aa.Address ad
where a.ID = ?
...所以这会执行 2 条 sql 语句并返回所需的最小行集,我们可以将其解析为单个对象图。好的。
但是...如果,比如说,Address
被标记为延迟加载(并且Order
没有),访问Order
不会触发进一步的 sql 语句,但访问Address
会触发,尽管事实上两者都是急切加载的。
那么为什么上面的延迟加载的实体没有Address
被上面的语句急切地获取呢?