You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
We are using Nhibernate version 5.3.6, and we got the below exception when using session.Merge() to save graph (where there are some new child entites). We don't get this error with version 5.2.x. Any helps for this error?
NHibernate.AssertionFailure:null id in 'xxx' entry (don't flush theSession after an exception occurs)
at NHibernate.Event.Default.DefaultFlushEntityEventListener.CheckId(Objectobj,IEntityPersisterpersister,Objectid)
at NHibernate.Event.Default.DefaultFlushEntityEventListener.GetValues(Objectentity,EntityEntryentry,BooleanmightBeDirty,ISessionImplementorsession)
at NHibernate.Event.Default.DefaultFlushEntityEventListener.OnFlushEntity(FlushEntityEventevent)
at NHibernate.Event.Default.AbstractFlushingEventListener.FlushEntities(FlushEventevent)
at NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEventevent)
at NHibernate.Event.Default.DefaultAutoFlushEventListener.OnAutoFlush(AutoFlushEventevent)
at NHibernate.Impl.SessionImpl.AutoFlushIfRequired(ISet`1querySpaces)
at NHibernate.Impl.SessionImpl.List[T](CriteriaImplcriteria)
at NHibernate.Impl.CriteriaImpl.List[T]()
at NHibernate.Impl.CriteriaImpl.List()
at WriteHistoryForFaktorNotVorgemerktByKeyNummer(ISessionsession,BooleanisKanton,Int32keyNr)in FaktorHistoryWriter.cs:line 113
at AllSessionsInterceptor.OnSave(Objectentity,Objectid,Object[]state,String[]propertyNames,IType[]types)in Data\DataAccess\AllSessionsInterceptor.cs:line 239
at NHibernate.Event.Default.AbstractSaveEventListener.SubstituteValuesIfNecessary(Objectentity,Objectid,Object[]values,IEntityPersisterpersister,ISessionImplementorsource)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Objectentity,EntityKeykey,IEntityPersisterpersister,BooleanuseIdentityColumn,Objectanything,IEventSourcesource,BooleanrequiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Objectentity,Objectid,IEntityPersisterpersister,BooleanuseIdentityColumn,Objectanything,IEventSourcesource,BooleanrequiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Objectentity,StringentityName,Objectanything,IEventSourcesource,BooleanrequiresImmediateIdAccess)
at NHibernate.Event.Default.DefaultMergeEventListener.MergeTransientEntity(Objectentity,StringentityName,ObjectrequestedId,IEventSourcesource,IDictionarycopyCache)
at NHibernate.Event.Default.DefaultMergeEventListener.EntityIsTransient(MergeEventevent,IDictionarycopyCache)
at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge(MergeEventevent,IDictionarycopiedAlready)
at NHibernate.Impl.SessionImpl.FireMerge(IDictionarycopiedAlready,MergeEventevent)
at NHibernate.Impl.SessionImpl.Merge(StringentityName,Objectobj,IDictionarycopiedAlready)
at NHibernate.Engine.CascadingAction.MergeCascadingAction.Cascade(IEventSourcesession,Objectchild,StringentityName,Objectanything,BooleanisCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeToOne(Objectparent,Objectchild,ITypetype,CascadeStylestyle,Objectanything,BooleanisCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeCollectionElements(Objectparent,Objectchild,CollectionTypecollectionType,CascadeStylestyle,ITypeelemType,Objectanything,BooleanisCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeCollection(Objectparent,Objectchild,CascadeStylestyle,Objectanything,CollectionTypetype)
at NHibernate.Engine.Cascade.CascadeAssociation(Objectparent,Objectchild,ITypetype,CascadeStylestyle,Objectanything,BooleanisCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeOn(IEntityPersisterpersister,Objectparent,Objectanything)
at NHibernate.Event.Default.DefaultMergeEventListener.CascadeOnMerge(IEventSourcesource,IEntityPersisterpersister,Objectentity,IDictionarycopyCache)
at NHibernate.Event.Default.DefaultMergeEventListener.EntityIsDetached(MergeEventevent,IDictionarycopyCache)
at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge(MergeEventevent,IDictionarycopiedAlready)
at NHibernate.Impl.SessionImpl.FireMerge(IDictionarycopiedAlready,MergeEventevent)
at NHibernate.Impl.SessionImpl.Merge(StringentityName,Objectobj,IDictionarycopiedAlready)
at NHibernate.Engine.CascadingAction.MergeCascadingAction.Cascade(IEventSourcesession,Objectchild,StringentityName,Objectanything,BooleanisCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeToOne(Objectparent,Objectchild,ITypetype,CascadeStylestyle,Objectanything,BooleanisCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeCollectionElements(Objectparent,Objectchild,CollectionTypecollectionType,CascadeStylestyle,ITypeelemType,Objectanything,BooleanisCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeCollection(Objectparent,Objectchild,CascadeStylestyle,Objectanything,CollectionTypetype)
at NHibernate.Engine.Cascade.CascadeAssociation(Objectparent,Objectchild,ITypetype,CascadeStylestyle,Objectanything,BooleanisCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeOn(IEntityPersisterpersister,Objectparent,Objectanything)
at NHibernate.Event.Default.DefaultMergeEventListener.CascadeOnMerge(IEventSourcesource,IEntityPersisterpersister,Objectentity,IDictionarycopyCache)
at NHibernate.Event.Default.DefaultMergeEventListener.EntityIsDetached(MergeEventevent,IDictionarycopyCache)
at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge(MergeEventevent,IDictionarycopiedAlready)
at NHibernate.Event.Default.DefaultMergeEventListener.OnMerge(MergeEventevent)
at NHibernate.Impl.SessionImpl.FireMerge(MergeEventevent)
at NHibernate.Impl.SessionImpl.Merge(StringentityName,Objectobj)
at NHibernate.Impl.SessionImpl.Merge[T](Tentity)
The text was updated successfully, but these errors were encountered:
So it seems inside Merge operation your interceptor tries to load some data. And auto flush logic executed before query tries to perform session flush that leads to this exception.
You can try to disable auto flush logic inside your interceptor by temporary setting session.FlushMode to Commit or Manual value.
With our case, in the interceptor, we want to take the "id" of new entity to call the store procedure to do some business. If we use session.FlushMode to Commit or Manual value, can we get the "id" of new entity ?
With our case, in the interceptor, we want to take the "id" of new entity
Hm.. So after #1754 entity DB insert for Merge is delayed till flush and id is not yet available in IInterceptor.OnSave (which seems wasn't really designed for your use case as description states "Called before an object is saved". It's clearly was not true for objects with identity id. Now it actually behaves as described) This behavior was already discussed in #2632 (though this case shows that it also can lead to some unexpected exception)
Issue aside it seems more proper place for your case is using IPostInsertEventListener (add your custom class to configuration.EventListeners.PostInsertEventListeners) as it's always called after entity is already inserted.
We are using Nhibernate version 5.3.6, and we got the below exception when using session.Merge() to save graph (where there are some new child entites). We don't get this error with version 5.2.x. Any helps for this error?
The text was updated successfully, but these errors were encountered: