Clarification on NH-2596 of PreUpdate vs OnSaveOrUpdate semantics

422 views
Skip to first unread message

Scott Findlater

unread,
Apr 5, 2011, 4:27:59 AM4/5/11
to nhusers
Please may I ask for clarification on the semantics/ usage of
PreUpdate vs OnSaveOrUpdate listeners based on NH-2596 (http://
216.121.112.228/browse/NH-2596).

After reading Ayende's blog posts on NHibernate
IPreUpdateEventListener & IPreInsertEventListener (http://ayende.com/
Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-
ipreinserteventlistener.aspx) with an audit trail example I adopted
this method myself. During my learning I raised NH-2617 (http://
216.121.112.228/browse/NH-2617) issue, where I found PreUpdate event
data changes on an entity which is only modified in the PreUpdate
event is not persisted.

My issue was closed as a duplicate of NH-2596. However, NH-2596 is
also closed as “not an issue” with the solution to use the
OnSaveOrUpdate event listeners on the basis that pre-insert and pre-
update listeners are not intended to be used to change the values of
the entity. Instead they should be used to check-values (for that
reason they return "veto").

I am alittle confused as to the best practice usages/ semantics of
PreUpdate vs OnSaveOrUpdate now. Would someone be able to clarify why
the use of PreInsert and PreUpdate is used by many for Audit trailing
but incorrectly? Or why is the OnSaveOrUpdate listener suggested in
the closure of NH-2596 and this non peristance is not an issue.

Many thanks, Scott.

Suman

unread,
Apr 6, 2011, 2:58:06 AM4/6/11
to nhusers
Hi Scott,

I have similar issue and I was about to ask the same question here.

Further to your situation, I am not sure whether it's a bug or
feature, In my mapping, when I have dynamic-update = "true" in
subclass the audit columns in base class, the generated sql doesn't
include audited column (ModifiedBy & ModifiedDate which are properties
of base class) but if I remove dynamic-update = "true" it works. So
essentially it points me to some reflection + dynamic-update issue.
Just wondering if that's what's happening in your side as well.

Suman

Scott Findlater

unread,
Apr 6, 2011, 3:42:08 AM4/6/11
to nhusers
Hi Suman,

I would be interested to know if you are updating any other properties
in your subclass, that after removing dynamic-update=true, all works.
This is because if I update a property on the subclass then any
processing in the PreUpdate event is persisted, but if the subclass is
only modified in the PreUpdate event then nothing is persisted.

Suman

unread,
Apr 7, 2011, 10:30:27 PM4/7/11
to nhusers
In my case, There is always some update on subclass.

I haven't tested it the exact scenario that you've mentioned but yeah
seems like it's still an issue.

Fabio Maulo

unread,
Apr 8, 2011, 1:59:51 AM4/8/11
to nhu...@googlegroups.com
Scott,
to change properties try to follow what I said and you will see that it is even more easy (you have to deal only with your object and not with NH internals).

--
You received this message because you are subscribed to the Google Groups "nhusers" group.
To post to this group, send email to nhu...@googlegroups.com.
To unsubscribe from this group, send email to nhusers+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.




--
Fabio Maulo

Message has been deleted
Message has been deleted

Scott Findlater

unread,
Apr 8, 2011, 8:59:10 AM4/8/11
to nhusers
Fabio, thank you so much for your reply.

Sorry I do not think I am explaining myself very well, may I please
ask you to download this sln
(http://dl.dropbox.com/u/20651208/WTF.zip)
and I can demonstrate with just 3 tests in the
BecauseOfEventHandling class;

1. Test a_onPre_event_listeners_fired_and_entities_modified() shows
the OnPreUpdate event is processing as expected.

2. Test
b_onPreUpdate_event_listener_fired_but_no_persistance_on_auditable_entity()
shows where I have my issue.

3. Test
c_onPreUpdate_event_listener_fired_with_persistance_on_auditable_entity()
shows a work around which highlights an issue??

I hope this makes everything clearer and that I am not trying to do
any NH internal stuff, only using the OnPreUpdate event listeners.
Thank you so much for your patience.

On Apr 8, 6:59 am, Fabio Maulo <fabioma...@gmail.com> wrote:
> Scott,
> to change properties try to follow what I said and you will see that it is
> even more easy (you have to deal only with your object and not with NH
> internals).
>

Fabio Maulo

unread,
Apr 8, 2011, 10:52:29 AM4/8/11
to nhu...@googlegroups.com
Scott,
PreUpdate, PreInsert, PreDelete are to check entity state (as most even to log) but NOT TO CHANGE entity state.
Again, try to follow what I said.

To Log the old state or the difference you can use even the PostXYZ.

On Fri, Apr 8, 2011 at 9:54 AM, Scott Findlater <scottfi...@gmail.com> wrote:
Fabio, thank you so much for your reply.

Sorry I do not think I am explaining myself very well, may I please
ask you to download this sln (http://dl.dropbox.com/u/20651208/
WTF.zip) and I can demonstrate with just 3 tests in the
BecauseOfEventHandling class;

1. Test a_onPre_event_listeners_fired_and_entities_modified() shows
the OnPreUpdate event is processing as expected.
2. Test
b_onPreUpdate_event_listener_fired_but_no_persistance_on_auditable_entity()
shows where I have my issue.
3. Test
c_onPreUpdate_event_listener_fired_with_persistance_on_auditable_entity()
shows a work around which highlights an issue??

I hope this makes everything clearer and that I am not trying to do
any NH internal stuff, only using the OnPreUpdate event listeners.
Thank you so much for your patience.


On Apr 8, 6:59 am, Fabio Maulo <fabioma...@gmail.com> wrote:
> Scott,
> to change properties try to follow what I said and you will see that it is
> even more easy (you have to deal only with your object and not with NH
> internals).
>



--
Fabio Maulo

Scott Findlater

unread,
Apr 8, 2011, 11:58:41 AM4/8/11
to nhusers
Hi Fabio, OK, obviously you are right :) I will stop trying to change
entity state in these events. It is just NOT TO CHANGE state in these
events is not really documented anywhere and from blog posts give
examples of using the OnPreInsert and OnPreUpdate event listeners as
the perfect place for mechanisms such as Audit trails which do change
entity state. To conclude, I will obviously follow your guidance. I
really appreciate your patience. Kind regards, Scott.

On Apr 8, 3:52 pm, Fabio Maulo <fabioma...@gmail.com> wrote:
> Scott,
> PreUpdate, PreInsert, PreDelete are to check entity state (as most even to
> log) but NOT TO CHANGE entity state.
> Again, try to follow what I said.
>
> To Log the old state or the difference you can use even the PostXYZ.
>

Fabio Maulo

unread,
Apr 8, 2011, 2:33:28 PM4/8/11
to nhu...@googlegroups.com
"is not really documented anywhere"
That is only because we are still waiting your patch for the NHibernate public documentation.
If you don't want to send a patch you can use the nhforge wiki, the knol (http://knol.google.com), share your experience in your blog, share your experience in the www.nhforge.org blog

We wrote tons of code, somebody else can write a little bit of text.
Message has been deleted

Scott Findlater

unread,
Apr 8, 2011, 4:52:41 PM4/8/11
to nhusers
Touche Fabio :) I will happily contribute to the documentation but
how do I explain a contradiction in the official NHibernate wiki
article which uses the OnPre events TO CHANGE STATE -
http://nhforge.org/wikis/howtonh/creating-an-audit-log-using-nhibernate-events.aspx

On Apr 8, 7:33 pm, Fabio Maulo <fabioma...@gmail.com> wrote:
> "is not really documented anywhere"
> That is only because we are still waiting your patch for the NHibernate
> public documentation.
> If you don't want to send a patch you can use the nhforge wiki, the knol (http://knol.google.com), share your experience in your blog, share your
> experience in thewww.nhforge.orgblog
>
> We wrote tons of code, somebody else can write a little bit of text.
>
> On Fri, Apr 8, 2011 at 12:58 PM, Scott Findlater
> <scottfindla...@gmail.com>wrote:

Fabio Maulo

unread,
Apr 8, 2011, 6:10:03 PM4/8/11
to nhu...@googlegroups.com
I asked you to write a wiki, right ?
well... imagine that you do it and after some moths somebody else will ask me "why that wiki say those things ?"
what should I answer ? 

On Fri, Apr 8, 2011 at 5:34 PM, Scott Findlater <scottfi...@gmail.com> wrote:
Touche Fabio :)
I will make a deal with you ... I will write an in depth documentation
patch about the NH event model if you can please explain why there is
wiki article explaining how to create an audit log which clearly uses
the OnPre events to CHANGE ENTITY state -
http://nhforge.org/wikis/howtonh/creating-an-audit-log-using-nhibernate-events.aspx


On Apr 8, 7:33 pm, Fabio Maulo <fabioma...@gmail.com> wrote:
> "is not really documented anywhere"
> That is only because we are still waiting your patch for the NHibernate
> public documentation.
> If you don't want to send a patch you can use the nhforge wiki, the knol (http://knol.google.com), share your experience in your blog, share your
> experience in thewww.nhforge.orgblog
>
> We wrote tons of code, somebody else can write a little bit of text.
>
> On Fri, Apr 8, 2011 at 12:58 PM, Scott Findlater



--
Fabio Maulo

Scott Findlater

unread,
Apr 9, 2011, 3:19:54 AM4/9/11
to nhusers
Fabio, I would like you to answer it is wrong or why it is ok, because
on one hand you tell me do not change state in these events and on the
other hand there are NH wiki posts changing state in these events. I
am very confused as to what is correct?

On Apr 8, 11:10 pm, Fabio Maulo <fabioma...@gmail.com> wrote:
> I asked you to write a wiki, right ?
> well... imagine that you do it and after some moths somebody else will ask
> me "why that wiki say those things ?"
> what should I answer ?
>
> On Fri, Apr 8, 2011 at 5:34 PM, Scott Findlater <scottfindla...@gmail.com>wrote:
>
>
>
> > Touche Fabio :)
> > I will make a deal with you ... I will write an in depth documentation
> > patch about the NH event model if you can please explain why there is
> > wiki article explaining how to create an audit log which clearly uses
> > the OnPre events to CHANGE ENTITY state -
>
> >http://nhforge.org/wikis/howtonh/creating-an-audit-log-using-nhiberna...

Fabio Maulo

unread,
Apr 9, 2011, 7:56:25 AM4/9/11
to nhu...@googlegroups.com
Try what I said and then prepare your article using WLW; then you can copy&paste the HTML in nhforge wiki.

Graham Bunce

unread,
Apr 9, 2011, 5:03:01 PM4/9/11
to nhusers
Scott,

To jump in here. I wrote the article you referred to in your reply to
Fabio, and tbh, I wouldn't consider it official NHibernate
documentation. It was written a long time ago as an example of the
things you could do with the events,when documentation on the
interfaces as opposed to the old interceptors was very thin on the
ground, and my article was written to formalise Ayende's article so
that NH Forge had something that could be easily found.

If it is not best practice then I can only apologise for the confusion
it has caused, but this is the problem with NH; there is little
"official" documentation , except maybe the NH 3.0 cookbook. Most
people, including myself, take blogs from people like Ayende as the
defacto documentation as we know they are core contributors to NH. If
people like Ayende are writing blogs (which are basically around
forever) that are either inaccurate or have become so with subsequent
releases, then there isn't a lot us "normal" people can do who do not
understand the inner workings of NH as well as people like Fabio.

When I get time I will look into amending the offending wiki entry.

Graham Bunce

unread,
Apr 9, 2011, 5:07:34 PM4/9/11
to nhusers
And just to clarify, this isn't a complaint at anyone. NH is a free
product that is as good as anything else on the market, if not better,
and it's worked on unpaid by the developers, so those of us who use it
should be grateful for this and that NH is still an active product.

On the flip side, the developers should also appreciate that
information on NH is scattered all over the place, is sometimes
contradictory, and can be very confusing to those trying to understand
how it all works.

peace :)

Fabio Maulo

unread,
Apr 10, 2011, 8:11:23 AM4/10/11
to nhu...@googlegroups.com
Graham.
In NH you can archive the same target in various ways.
Your wiki (What I Know Is) is good enough to solve a problem in a way.
but....
but a WIKI is a WIKI 
for example this WIKI shows various tech to do the same http://nhforge.org/wikis/howtonh/localization-techniques.aspx
When a user find something wrong in a WIKI he can modify/correct it even if it was wrote by somebody else.
This is the spirit of the WIKI... it does not to be perfect.. it just need to be perfectible.

Thanks Graham for your support and your spirit sharing your knowledge.


--
You received this message because you are subscribed to the Google Groups "nhusers" group.
To post to this group, send email to nhu...@googlegroups.com.
To unsubscribe from this group, send email to nhusers+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.




--
Fabio Maulo

Scott Findlater

unread,
Apr 27, 2011, 2:12:46 AM4/27/11
to nhusers
Hi,

Fabio - thanks for your patience through this.
Graham - thanks for your comments.

I have written a NHForge WIKI article in the hope of documenting what
I know -
http://nhforge.org/wikis/howtonh/nhibernate-audit-trails-and-onpreinsert-onpreupdate-event-listeners-vs-save-update-event-listeners.aspx

Your comments would be greatfully received.

On Apr 10, 1:11 pm, Fabio Maulo <fabioma...@gmail.com> wrote:
> Graham.
> In NH you can archive the same target in various ways.
> Your wiki (What I Know Is) is good enough to solve a problem in a way.
> but....
> but a WIKI is a WIKI
> for example this WIKI shows various tech to do the samehttp://nhforge.org/wikis/howtonh/localization-techniques.aspx
> <http://nhforge.org/wikis/howtonh/localization-techniques.aspx>When a user
> find something wrong in a WIKI he can modify/correct it even if it was wrote
> by somebody else.
> This is the spirit of the WIKI... it does not to be perfect.. it just need
> to be perfectible.
>
> Thanks Graham for your support and your spirit sharing your knowledge.
>

Scott Findlater

unread,
May 11, 2011, 8:34:37 AM5/11/11
to nhusers
Fabio - there seem to be alot of cries for help but with no conclusive
working examples;

* https://groups.google.com/forum/#!topic/nhusers/0kugoXFPeGw/discussion
- audit listener using IFlushEntityEventListener (continuation of
NH-2596)

* http://groups.google.com/group/nhusers/browse_thread/thread/10d7c2542e3849af#
- Bizarre error when using NHibernate, IPreInsertEventListener,
Oracle, batching and sequences

As you know I did author an NHForge WIKI
http://nhforge.org/wikis/howtonh/nhibernate-audit-trails-and-onpreinsert-onpreupdate-event-listeners-vs-save-update-event-listeners.aspx
but my solution does not solve the above "audit listener using
IFlushEntityEventListener (continuation of NH-2596)" problem.

Please please would you consider authoring a working, best practice,
example.
Kind regards, Scott.

On Apr 27, 7:12 am, Scott Findlater <scottfindla...@gmail.com> wrote:
> Hi,
>
> Fabio - thanks for your patience through this.
> Graham - thanks for your comments.
>
> I have written a NHForge WIKI article in the hope of documenting what
> I know -http://nhforge.org/wikis/howtonh/nhibernate-audit-trails-and-onpreins...

Fabio Maulo

unread,
May 11, 2011, 9:57:59 AM5/11/11
to nhu...@googlegroups.com
Send me your little domain with a little explanation about how should work those 2 DateTime, then I'll write a public post using your domain.

Filip Kinsky

unread,
May 11, 2011, 10:01:21 AM5/11/11
to nhu...@googlegroups.com
you can use/fork my test case for NH-2596 here: https://github.com/Buthrakaur/NHListenerTests
Message has been deleted

Fabio Maulo

unread,
May 11, 2011, 11:39:51 AM5/11/11
to nhu...@googlegroups.com
Sure, I can.

Filip Kinsky

unread,
May 11, 2011, 1:22:27 PM5/11/11
to nhu...@googlegroups.com
I managed to solve this problem using this IFlushEntityEventListener implementation: https://github.com/Buthrakaur/NHListenerTests/blob/master/NHListenerTest/SetModificationTimeFlushEntityEventListener.cs
Reply all
Reply to author
Forward
0 new messages