.net - 通过 NHibernate 使用无状态 session 渴望获取曾孙集合

标签 .net nhibernate eager-loading stateless-session

我正在使用 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>();

当我执行此操作时,TwoPhaseLoadInitializeEntity 期间抛出异常,因为 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/

相关文章:

c# - WCF服务中如何实现回调?

.NET - 字典锁定与 ConcurrentDictionary

c# - 当某些方法不会被使用/不实现时,使用接口(interface)还是抽象类?

c# - 查找子集合包含列表所有元素的行

ruby-on-rails - RSpec:测试范围预加载

configuration - Rails 5 测试版 : Put eager_load_paths config on initializer throw frozen array exception

entity-framework - 如何在没有延迟加载的情况下默认加载 Entity Framework ICollection?

c# - 如何在C#中继承C++/CLI接口(interface)?

sql - Nhibernate CreateSQLQuery 错误 - ',' 附近的 SetParameterList 语法不正确

NHibernate:将子实体投影到父属性中会引发异常