我正在使用 NHibernate 无状态 session 将批量数据加载到数据库中。加载数据时,后面的实体需要查找以前的实体,以便将它们添加到子集合中。此操作涉及需要有关孙对象的数据,而孙对象又需要可用的曾孙集合。
标准看起来像这样:
var result = InternalRepository.CreateCritera<Root>()
.SetResultTransformer(Transformers.DistinctRootEntity)
.Add(Restrictions.IdEq(id))
.SetFetchMode("Child", FetchMode.Eager)
.CreateAlias("Child", "a", JoinType.LeftOuterJoin)
.SetFetchMode("a.Grandchild", FetchMode.Eager)
.CreateAlias("Grandchild", "b", JoinType.LeftOuterJoin)
.SetFetchMode("b.GreatGrandchildCollection", FetchMode.Eager)
.UniqueResult<Root>();
当我执行此操作时,TwoPhaseLoad
在 InitializeEntity
期间抛出异常,因为 session 的持久性上下文实体条目为空:
at NHibernate.Engine.TwoPhaseLoad.InitializeEntity(Object entity, Boolean readOnly, ISessionImplementor session, PreLoadEvent preLoadEvent, PostLoadEvent postLoadEvent) in TwoPhaseLoad.cs: line 64
at NHibernate.Loader.Loader.InitializeEntitiesAndCollections(IList hydratedObjects, Object resultSetId, ISessionImplementor session, Boolean readOnly) in Loader.cs: line 603
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in Loader.cs: line 472
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in Loader.cs: line 243
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) in Loader.cs: line 1694
...
加载器查找的实体是子实体。为什么持久性上下文条目映射在这里是空的?显然正在获取对象(生成正确的 SQL 并返回正确的结果),并且正确创建了“子”实体。为什么实体构建状态不正确?它与无状态 session 在急切加载期间如何使用临时持久性上下文有关吗?
最佳答案
看起来这是无状态 session 在两阶段加载期间如何管理临时持久性上下文的限制。显然,Hibernate 中存在一个尚未移植到 NHibernate 的修复程序。
https://issues.jboss.org/browse/JBPAPP-3737
更新:
是的,上述问题也是 NHibernate 中的问题。我在这里提交了一个补丁:https://nhibernate.jira.com/browse/NH-2669
关于.net - 通过 NHibernate 使用无状态 session 渴望获取曾孙集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5751197/