Description
Please see attached file for reproducible project (also included database script)
Step to reproduce:
In the context of my example project I have a Post
and a Comment
table.
A Post
has a one-to-many relationship to Comment
PostMap
is also configured to use CollectionLazy.NoLazy
against Comments
Step 1. I try to query a Post
, then retrieve it via a FutureValue
, which works.
Step 2. Do a session.Clear()
Step 3. Later on (still in the same Session
), I tried another query but it throws an exception:
Unhandled exception. NHibernate.HibernateException: collection is not associated with any session
at NHibernate.Collection.AbstractPersistentCollection.ForceInitialization()
at NHibernate.Engine.StatefulPersistenceContext.InitializeNonLazyCollections()
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies, IResultTransformer forcedResultTransformer, QueryCacheResultBuilder queryCacheResultBuilder)
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters, IResultTransformer forcedResultTransformer, QueryCacheResultBuilder queryCacheResultBuilder)
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces)
at NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session)
at NHibernate.Loader.Criteria.CriteriaLoaderExtensions.LoadAllToList[T](IList`1 loaders, ISessionImplementor session)
at NHibernate.Impl.SessionImpl.List[T](CriteriaImpl criteria)
at NHibernate.Impl.CriteriaImpl.List[T]()
at NHibernate.Criterion.QueryOver`1.List()
at NHibernate.Criterion.QueryOver`1.NHibernate.IQueryOver<TRoot>.List()
at NoLazyNHibernate.Program.Main(String[] args) in
After step 1, when inspecting the session.GetSessionImplementation().PersistenceContext
, I found that it has 1 item in the private
field nonLazyCollections
, which doesn't seem to go away even if session.Clear()
is used.
It seems loading a Post
using Future
will cause NHibernate to leave a dangling NonLazyCollections
(for Comment
entity) in its StatefulPersistenceContext
.
Please help check. Thanks.
Note:
There's a different in implementation I found when comparing Java's Hibernate implementation with NHibernate's implementation.
In the same StatefulPersistenceContext.clear()
, NHibernate doesn't clear the nonlazyCollections
, but Hibernate does. I'm wondering if this is a bug or is it intended ?
NHibernate: