2011-04-22 27 views
3

我正在使用NHibernate無狀態會話將批量數據加載到數據庫中。隨着數據的加載,以後的實體需要查找以前的實體,以便將它們添加到子集合中。此操作涉及需要有關孫子對象的數據,而該子對象又需要一個超級孫子集合纔可用。通過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並返回正確的結果),並且正確創建了「子」實體。爲什麼實體構建狀態不正確?它是否與無狀態會話在預加載期間如何使用臨時持久化上下文有關?

+0

看起來他們拒絕了你的補丁,因爲它打破了另一個單元測試,你有沒有得到任何反饋呢? – 2011-06-22 16:41:50

+0

是的,Fabio確實包括了很多修補程序和其他修補程序以及無狀態會話的改進。它現在在NH 3.2 Beta 2中。 – codekaizen 2011-06-22 17:57:25

+0

非常好,感謝您的辛勤工作和答覆! – 2011-06-22 21:18:11

回答

相關問題