有没有办法在加载时动态设置两个实体之间的加载策略?
例如,如果我有一个Parent
实体,其中包含Child
个实体的列表,我可能希望在某些情况下加载具有延迟加载子项的“父”实体,并在其他情况下加载急切加载。
有办法做到这一点吗?映射似乎意味着它的一个或另一个。
答案 0 :(得分:8)
是的,建议的策略是默认您的实体使用延迟加载,然后当您想要加载它们时,您需要更改查询并指定您希望您的孩子被急切加载。
至于如何实际实现预先加载,它取决于您正在使用的查询样式。 (即Linq2NH,Criteria,HQL)
例如,对于Linq2NH,我相信它是这样的:
session.Query<Parent>().Fetch(p => p.Child)...
使用HQL,您可以使用
取
像这样:
from Parent as p left join fetch p.Child...
最后,使用Criteria API,您可以执行以下操作:
var criteria = context.Session.CreateCriteria<Parent>();
criteria.SetFetchMode("Child", NHibernate.FetchMode.Eager);
....