1 use the interface as fabio Said. 2 the order of the listeners is important. I think you should put yours after the nhibernates for this case... But to be honest i am not sure. Ill try it tomorrow
2011/5/8, Krzysztof Kozmic <[email protected]>: > ok here comes the update. > > I checked the approach outlined by Fabio again. I implemented the > ISaveOrUpdate and IEntityFlush event listeners and I set the values > directly on the object. > > However even though I can see the values are set on the object the > INSERT that NHibernate tries to execute passes NULL values for those > properties instead. > > Also as a sidenote I noticed even non-dirty objects are passed to > those listeners which is at least surprising to me. > > Also as another sidenote, I used as my base class > DefaultSaveOrUpdateListener and I'm overriding EntityIsPersistent/ > EntityIsTransient methods and NHibernate is passing my newly created > object to EntityIsPersistent method which is again at least > surprising. > > Anyway - the biggest issue is that NHibernate does not seem to care > about the values I provide to the object in the listener and I'm sure > they are set, because if I look in the debugger at the time the > exception is thrown the values are set and I could see my listeners > get hit. > > cheers, > Krzysztof > > On May 7, 2:10 pm, Krzysztof Kozmic <[email protected]> > wrote: >> I did briefly try that, and ended up having some different issues >> (don't remember exactly what the problem was now, I'll try to >> reproduce that on Monday). >> >> Does FlushEventListener get called for dirty objects only? >> >> Cheers, >> Krzysztof >> >> On May 6, 10:04 pm, Fabio Maulo <[email protected]> wrote: >> >> >> >> >> >> >> >> > IPreUpdate is intended to be used for entity-state checking (veto) not >> > to >> > change the state. >> > What is happening is that NH found a strange operation in a collection >> > (something like "somebody have changed it outside my control or I have a >> > bug"). >> > For what you need you have to use ISaveOrUpdateEventListener >> > public void OnSaveOrUpdate(SaveOrUpdateEvent @event) >> > { >> > var trackable = @event.Entity as ITrackModificationDate; >> > if (trackable != null) >> > { >> > trackable.LastModified = CurrentDateTimeProvider(); >> >> > } >> > } >> >> > and IFlushEntityEventListener >> > public void OnFlushEntity(FlushEntityEvent @event) >> > { >> > if(@event.EntityEntry.Status == Status.Deleted) >> > { >> > return;} >> >> > var trackable = @event.Entity as ITrackModificationDate; >> > if (trackable != null) >> > { >> > trackable.LastModified = CurrentDateTimeProvider(); >> >> > } >> > } >> >> > As you can see, using right events you don't need to use NH internals >> > state. >> >> > For collection you have another set of events. In general *you shouldn't >> > initialize a collection* in an NH's event. >> >> > 2011/5/6 Krzysztof Ko¼mic <[email protected]> >> >> > > I'm using Oracle database. >> > > I have a IPreUpdateEventListener and IPreInsertEventListener which set >> > > CreatedBy and UpdatedBy properties on some of the entities. >> >> > > Those properties point to another entity Person which is assigned in >> > > the >> > > listeners via Session.Load<> >> >> > > this all used to work quite nice when I had my POID generator >> > > specified as >> > > "sequence-identity" (we use sequences in Oracle) >> >> > > today I tried to switch POID generator to "sequence" which would allow >> > > me >> > > to utilize batching which I also enabled. >> >> > > Here's where I started getting this exception: >> >> > > collection: [Person.FooBars] was not processed by flush() >> >> > > the exception happens only when the Session.Load<> in my event >> > > listeners >> > > doesn't already have the Person I'm requested accessible (that is only >> > > when >> > > Load<Person> returns a proxy). If I load the person beforehand (and >> > > not in >> > > the listener) the exception does not occur. >> >> > > Any ideas what the reason for that is and how do I fix it? >> >> > > Krzysztof >> >> > > -- >> > > You received this message because you are subscribed to the Google >> > > Groups >> > > "nhusers" group. >> > > To post to this group, send email to [email protected]. >> > > To unsubscribe from this group, send email to >> > > [email protected]. >> > > For more options, visit this group at >> > >http://groups.google.com/group/nhusers?hl=en. >> >> > -- >> > Fabio Maulo > > -- > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/nhusers?hl=en. > > -- Enviado desde mi dispositivo móvil -- You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.
