通过NHibernate使用无状态会话急切地获取曾孙系列

时间:2011-04-22 00:29:57

标签: .net nhibernate eager-loading stateless-session

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

加载器正在查找的实体是Child实体。为什么持久化上下文条目在这里映射为空?显然正在获取该对象(生成正确的SQL并返回正确的结果),并正确创建“Child”实体。为什么实体构造状态不正确?是否与无状态会话在预先加载期间如何使用临时持久性上下文有关?

1 个答案:

答案 0 :(得分:2)

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

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

<强>更新

是的,上面的问题也是NHibernate的问题。我在这里提交了一个补丁:https://nhibernate.jira.com/browse/NH-2669