nhibernate - 使用 ActiveRecord 在 nHibernate 中急切加载延迟加载的实体

标签 nhibernate activerecord lazy-loading castle-activerecord aggregateroot

我正在开发一个项目,该项目具有丰富的对象模型和各种聚合根集。

我们正在使用 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/

相关文章:

java - 使用纯 JPA 和 Spring 在 View 中打开 session - 而不是 Hibernate session

NHibernate force not-found ignore 不执行额外的选择

nhibernate - NHibernate-从存储过程填充单个属性

c# - 当我们使用 Nhibernate 3.2 的代码映射时,如何允许自动导入 ="true"?

sql - 如何在 Rails 中链接原始 SQL 查询或如何从 Rails 中的原始 SQL 查询返回 ActiveRecord_Relation?

javascript - 在 highcharts 中选择绘图时获取图表的坐标

lazy-loading - iBatis 是否像 Hibernate 一样支持延迟加载?

NHibernate映射: is it possible to insert values into the database via a mapping file without using a property?

ruby-on-rails - Rails ActiveRecord 存储中的动态属性

sql - Rails HABTM 查询——带有所有标签的文章