English post
En este post comentábamos sobre StatelessSession como nueva feature de NHibernate, ahora bien, otra de las features disponibles en el trunk de NHibernate (portada de Hibernate) son los EventListeners. Con ellos podemos interceptar acciones llevadas a cabo por NHibernate antes o después de que se realicen como por ejemplo un Save, Update, Load, Flush entre otras.
En este ejemplo vamos a realizar acciones antes y después de que se ejecute el comando Save(object).
Definimos el EventListener:
public class MySaveEventListener : NHibernate.Event.Default.DefaultSaveOrUpdateEventListener
{
protected override void CascadeBeforeSave(IEventSource source, IEntityPersister persister,
object entity, object anything)
{
Console.WriteLine(“Before Save the entity “ + entity);
base.CascadeBeforeSave(source,persister,entity,anything);
}
protected override void CascadeAfterSave(IEventSource source, IEntityPersister persister,
object entity, object anything)
{
Console.WriteLine(“After Save the entity “ + entity);
base.CascadeAfterSave(source,persister,entity,anything);
}
}
Y para configurarlo programaticamente con el SessionFactory hacemos:
Configuration cfg = new Configuration();
cfg.Configure(“hibernate.cfg.xml”);
cfg.SetListener(ListenerType.Save, new MySaveEventListener());
Ahora realizamos un Save:
using (ISessionFactory sf = cfg.BuildSessionFactory())
{
using (ISession session = sf.OpenSession())
{
Foo f1 = new Foo();
f1.Misc = “m1″;
f1.Name = “n1″;
session.Save(f1);
session.Flush();
}
}
Y este es el resultado de la consola, incluyendo el SQL que NHibernate generó:
Before Save the entity Entity Foo:0:n1
NHibernate: INSERT INTO Foo (Name, Misc) VALUES (@p0, @p1); select SCOPE_IDENTIT
Y(); @p0 = 'n1', @p1 = 'm1'
After Save the entity Entity Foo:1:n1
Foo tiene un object id como Integer e Identity. Antes de guardarse la property Id tiene como valor 0, despues del Save tiene como valor 1 (debido a que es el primer objeto en la base).