I am using NHibernate interceptors to log information about Updates/Inserts/Deletes to my various entities.
Included in the information logged is the Entity Type and the Unique Id of the entity modified. The unique Id is marked as a <generator class="identity">
in the NHibernate mapping file.
The obvious problem is when logging an Insert operation using IInterceptor.OnSave() the Id of the entity has not yet been assigned.
How can I obtain the Id of the inserted entity before logging the audit information?
(I have looked into NHibernate Listeners PostSave event but can't get them working with the Spring.net configuration being used, so I would like to stick with interceptors if at all possible)
Code:
// object id parameter is null...
public override bool OnSave(object entity, object id, object[] state,
string[] propertyNames, IType[] types)
{
AddAuditItem(entity, INSERT);
return false;
}
Best Solution
I've worked around this problem by adding a list to my interceptor class which is populated with objects during the
OnSave
implementation.In the
PostFlush
implementation the list is iterated over and each element is audited as an insert. The objects in this list have been persisted inPostFlush()
and thus have generated IDs.This seems to work OK but I'd be grateful if any potential pitfalls were pointed out :-)