我正在开发一个项目,该项目具有丰富的对象模型和各种聚合根集。
我们正在使用 CaSTLe 堆栈(通过 ActiveRecord 实现单轨到 nHibernate)。
我们已将聚合根标记为惰性[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
没有被上面的语句急切地获取呢?
最佳答案
对 Account.Order.Product 实体执行“内部联接获取”。因此,不要像这样(您可能已经拥有):
"from Account a inner join fetch a.Order where a.ID = ?"
告诉它也获取 Order.Product:
"from Account a inner join fetch a.Order inner join fetch a.Order.Product where a.ID = ?"
关于nhibernate - 使用 ActiveRecord 在 nHibernate 中急切加载延迟加载的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/380568/