3

我正在使用 NHibernate 无状态会话将批量数据加载到数据库中。随着数据的加载,后面的实体需要查找以前的实体才能将它们添加到子集合中。此操作涉及需要有关孙对象的数据,而孙对象又需要可用的曾孙集合。

标准如下所示:

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

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 并返回正确的结果),并且正确创建了“子”实体。为什么实体构造状态不正确?它是否与无状态会话在急切加载期间如何使用临时持久性上下文有关?

4

1 回答 1

2

看起来这是无状态会话在两阶段加载期间如何管理临时持久性上下文的限制。显然,Hibernate 中存在一个尚未移植到 NHibernate 的修复程序。

https://issues.jboss.org/browse/JBPAPP-3737

更新

Yes, the above issue was the problem in NHibernate as well. I've submitted a patch here: https://nhibernate.jira.com/browse/NH-2669

于 2011-04-22T18:17:54.863 回答