Totalmente de acuerdo con Fabio,  creo que le estas delegando notificaciones
de tu negocio a la capa de persistencia.  Con respecto al ejemplo de
Persona, *persona y javier *serian la misma instancia (si no estoy mal, este
es uno de los casos donde NHibernate persiste a persona y luego realiza el
query).

Saludos,
Nestor Rodriguez

2010/11/23 tolemaC <[email protected]>

> Gustavo, no había visto el evento SaveOrUpdateEventListener, con este
> evento puedo cubrirlo todo, los eventos en la persistencia y también
> en la creación, se me había escapado
>
> Al verlo me surge una duda, he visto la interface a implementar:
>
> public interface ISaveOrUpdateEventListener
> {
>    void OnSaveOrUpdate(NHibernate.Event.SaveOrUpdateEvent event)
> }
>
> Entiendo que este evento es llamado cuando llamas a SaveOrUpdate, pero
> no tengo un antes y despues de hacer el SaveOrUpdate, buscando en
> internet he encontrado esto:
>
>
> http://www.codinginstinct.com/2008/04/nhibernate-20-events-and-listeners.html
>
> En este ejemplo se sobreescribe el metodo PerformSaveOrUpdate, en él
> podría implementar las acciones que quiero, pero esto significa que si
> asigno el evento SaveOrUpdate se elimina el que NHibernate tiene por
> defecto?
>
> Configuration cfg = new Configuration();
> cfg.EventListeners.SaveEventListeners =
>    new ISaveOrUpdateEventListener[] {new CustomSaveEventListener() };
>
> Al hacer esto ya no se llama el que NHibernate tiene por defecto?
>
> Saludos y gracias,
>
> On 23 nov, 17:39, tolemaC <[email protected]> wrote:
> > Gustavo, Nestor;
> >
> > Debido a los requisitos del negocio de mi aplicación, en algunos casos
> > (que no son pocos) necesito que cuando se crean o modifican entidades
> > de mi modelo, se creen o asocien otras entidades, dichas entidades
> > deben estar disponibles en NHibernate pues el mismo proceso dentro de
> > la misma transacción podrían consultarlos.
> >
> > Un ejemplo:
> >
> > Cuando en mi aplicación creo un Expediente nuevo asocio una Tarea a
> > dicho expediente, esta tarea es de tipo Realización Expediente y
> > debido a este tipo de expediente, se le asocia un ejecutor
> > predeterminado.
> >
> > 1) Comienzo transacción
> > 2) Creo el Expediente.
> > 3) Guardo el Expediente; hago SaveOrUpdate(expedienteNuevo) entonces
> > se disparan los eventos, se crea la tarea y se le asocia el ejecutor.
> > Pero todavía no he persistido los datos en la BD.
> > 4) Compruebo que el ejecutor de la Tarea asociada al Expediente tiene
> > permisos sobre el nuevo expediente. Si no tiene hago RollBack.
> > 5) Si todo ha ido bien hago Commit.
> >
> > Esta claro que todo esto se podría hacer sin eventos, pero lo gracioso
> > de todo esto es que este comportamiento de los expedientes se describe
> > en la base de datos como metadatos asignando tareas posteriores y
> > anteriores a las actuaciones sobre ciertas entidades de mi modelo. En
> > mi sistema puedes asignar acciones a eventos de ciertas entidades,
> > estas acciones pueden necesitar los datos que otras acciones crean y
> > necesitan encontrarlos en el momento. No me vale que estas acciones se
> > disparen cuando voy a persistir los datos, pues la aceptación o
> > denegación de la transacción puede depender de ellos.
> >
> > Espero haberme explicado.
> >
> > Si yo hago esto:
> >
> > Persona persona = new Persona() { Nombre = "Javier" };
> > session.SaveOrUpdate(p);
> > Persona javier =
> > session.CreateCriteria<Persona>()Add(Restrictions.Eq("Nombre",
> > "Javier")).List<Persona>()[0];
> >
> > "persona" y "javier", son el mismo objeto?
> >
> > La nueva persona creada debería estar en la cache de NHibernate
> > marcada para insertar, pero todavía no estaría en la base de datos
> > hasta que se haga Flush, ya sea haciendo Commit, Cerrando la sesión o
> > cualquier otra cosa que provoque el Flush.
> >
> > On 23 nov, 16:26, Nestor Rodriguez <[email protected]> wrote:
> >
> >
> >
> > > Seria interesante saber porque quieres escuchar el evento de
> SaveOrUpdate ?
> > > Los eventos a los que te refieres son eventos de persistencia y no de
> los
> > > objetos pues estos no conocen nada de persistencia.  Los triggers son
> por
> > > decirlo asi eventos particulares del motor de persistencia.
> >
> > > Saludos.
> >
> > > 2010/11/23 Gustavo Ringel <[email protected]>
> >
> > > > La respuesta corta es que tu SaveOrUpdate puede que nunca vaya a la
> base,
> > > > aun asi queres recibir un evento y hacer algo?
> >
> > > > La respuesta larga es que hay un SaveOrUpdateEventListener que
> debiera
> > > > hacer lo que vos buscas.
> >
> > > > Gustavo.
> >
> > > > 2010/11/23 tolemaC <[email protected]>
> >
> > > > Ahora si.
> >
> > > >> Genial el screencast, me ha sido de mucha ayuda, sobre todo me quedo
> > > >> con la frase de Scott W. Ambler, donde deja claro que para que el
> uso
> > > >> de ORM sea un exito hay que conocer tanto la parte de los objetos
> como
> > > >> la parte relacional, y conocidas estas hacer un buen uso de ambos
> > > >> paradigmas.
> >
> > > >> Hasta el momento yo me limitaba a usar NHibernate como una mera
> > > >> herramienta para acceder a mi sistema de base de datos relacional,
> > > >> pero usar un ORM implica más cosas.
> >
> > > >> En el screencast se ha hablado de eventos también, en la parte donde
> > > >> se enumeraban las cosas que un Framework ORM debería tener.
> > > >> Entiendo que un ORM trabaja con los objetos mapeados desde un
> sistema
> > > >> relacional, por lo tanto entiendo también que los eventos deberían
> > > >> responder a las acciones que haces con los objetos y no a las
> acciones
> > > >> que realiza el FW de ORM con la base de datos. Entonces si yo
> escribo
> > > >> un PreInserEventListener y lo asocio a mi SessionFactory, dicho
> evento
> > > >> debería ser llamado en el momento que yo guardo un objeto nuevo en
> el
> > > >> FW.
> >
> > > >> Es decir, si yo creo un objeto Persona y llamo a
> > > >> Session.SaveOrUpdate(), NHibernate debería dispararme las llamadas a
> > > >> el evento PreInsert y PostInsert antes y despues de insertar dicho
> > > >> objeto en el Framework, y no hacer lo cuando el framework envíe ese
> > > >> nuevo objeto a la base de datos. Para mi debe ser transparente el
> > > >> cuando
> > > >> NHibernate persista los objetos en la base de datos. Por lo tanto me
> > > >> da igual que NHibernate no haga nada cuando yo llamo a SaveOrUpdate,
> > > >> pero lo que está claro es que si el objeto es nuevo me debe llamar a
> > > >> PreInsert y PostInsert y si el objeto no es nuevo me debe de llamar
> a
> > > >> PreUpdate y PostUpdate.
> >
> > > >> Así lo entiendo yo.
> >
> > > >> Sin embargo he observado que NHibernate llama a los eventos solo
> > > >> cuando hace Flush, ya sea por que yo llamo a Flush o por que lo hace
> > > >> él internamente. Yo no quiero tener que hacer Flush para que se
> lancen
> > > >> mis eventos, quiero que se lancen cuando les toca.
> >
> > > >> La cosa, pues, es: ¿Los EventListeners están para disparar acciones
> en
> > > >> los eventos de los objetos o para disparar acciones en los eventos
> de
> > > >> los datos relacionales de mi RDBMS??
> >
> > > >> Yo opino que deben asociarse a los objetos, para los datos ya
> tenemos
> > > >> los triggers.
> >
> > > >> Saludos,
> >
> > > >> On 22 nov, 13:14, Fabio Maulo <[email protected]> wrote:
> > > >> > Sería muy bueno que ante de usar una herramienta basada en ORM se
> > > >> estudie un
> > > >> > poco el Object Relational Mappinghttp://
> > > >> altnet-hispano.pbworks.com/w/page/12367724/van-2009-09-19-intr...
> >
> > > >> > 2010/11/22 tolemaC <[email protected]>
> >
> > > >> > > Vaya no tenía que haber hecho dos preguntas en un mismo mensaje
> :/, ya
> > > >> > > lo se para la próxima.
> >
> > > >> > > Carlos Peix,
> >
> > > >> > > Imagina que estoy depurando mi código, justo antes de ejecutar
> el
> > > >> > > SaveOrUpdate de una entidad, dentro de una transacción, con el
> SQL
> > > >> > > Management Strudio realizo la consulta sobre la tabla y la
> consulta
> > > >> > > devuelve los registros, cuando llamo a SaveOrUpdate y antes de
> hacer
> > > >> > > commit, ejecuto la misma consulta en el SMS y se queda esperando
> hasta
> > > >> > > que me da un time-out, si hago commit entonces si puedo realizar
> la
> > > >> > > consulta.
> >
> > > >> > > José F. Romaniello,
> >
> > > >> > > Donde puedo aprender que es POID y que es HILO? no tengo ni idea
> de
> > > >> > > que es cada una de ellas.
> >
> > > >> > > Gustavo,
> >
> > > >> > > Lo que quiero es que, aunque esté en una transacción y hayan
> cambios
> > > >> > > pendientes de confirmar, pueda consultar la base de datos desde
> otro
> > > >> > > proceso, como por ejemplo el SQL Management Studio, y ver los
> cambios
> > > >> > > pendientes de dicha transacción, y en el caso de que se cancele
> la
> > > >> > > transacción esos datos desaparecerían.
> >
> > > >> > > La segunda pregunta la explicaré mejor en otro mensaje para no
> estar
> > > >> > > con dos cosas al mismo tiempo.
> >
> > > >> > > Muchas gracias a todos.
> > > >> > > Saludos,
> >
> > > >> > > On 22 nov, 11:20, Carlos Peix <[email protected]> wrote:
> > > >> > > > Hola tolemac,
> >
> > > >> > > > En cuanto al punto 1), estas seguro de que tenes un bloqueo o
> > > >> simplemente
> > > >> > > no
> > > >> > > > ves el registro en la DB? mas precisamente, tenes una
> excepcion de
> > > >> > > bloqueo o
> > > >> > > > sacas esa conclusion porque haces el query y no aparece el
> registro?
> >
> > > >> > > > Con respecto al punto 2), por diseño es tal como lo observas.
> > > >> > > eventualmente
> > > >> > > > y si queres ver los datos en la base de datos, deberias hacer
> un
> > > >> flush.
> >
> > > >> > > > ----------------------------------
> > > >> > > > Carlos Peix
> >
> > > >> > > > 2010/11/20 tolemaC <[email protected]>
> >
> > > >> > > > > Hola chicos,
> >
> > > >> > > > > Estoy haciendo un proyecto de gestión sobre WinForms con SQL
> > > >> Server y
> > > >> > > > > C# 4.0.
> > > >> > > > > Me he decidido por usar NHibernate (+ Fluent Nhibernate) y
> estoy
> > > >> muy
> > > >> > > > > contento con él.
> >
> > > >> > > > > Tengo dos dudas aunque en principio no son un problema:
> >
> > > >> > > > > 1) Cuando bajo una transacción creo una nueva entidad y
> llamo a
> > > >> > > > > Session.SaveOrUpdate(entidad), NHibernate me bloquea la
> tabla en
> > > >> la
> > > >> > > > > base de datos hasta que no hago Commit o Rollback. Al menos
> no
> > > >> puedo
> > > >> > > > > consultarla con el SQL Management Studio. El IsolateLevel de
> la
> > > >> > > > > transacción es ReadUncommitted. Hay alguna forma de que no
> te
> > > >> bloquee
> > > >> > > > > la tabla y se puedan ver los datos, que todavía no están
> > > >> confirmados,
> > > >> > > > > con el SQL Management Studio?
> >
> > > >> > > > > 2) Estoy manejando los eventos de la sesión (Events, no uso
> > > >> > > > > Intercetors), me he dado cuenta de que cuando llamo a
> > > >> > > > > Session.SaveOrUpdate no se generan los eventos hasta que no
> hago
> > > >> Flush
> > > >> > > > > en la sessión, ¿es normal? ¿como prodría evitarlo?, a mi me
> da
> > > >> igual
> > > >> > > > > cuando se haga flush, pero si me interesa mucho que el
> evento se
> > > >> > > > > dispare cuando llamo a SaveOrUpdate.
> >
> > > >> > > > > Un saludo a todos y gracias de antemano.
> >
> > > >> > > > > --
> > > >> > > > > Para escribir al Grupo, hágalo a esta dirección:
> > > >> > > > > [email protected]
> > > >> > > > > Para más, visite:
> > > >>http://groups.google.com/group/NHibernate-Hispano
> >
> > > >> > > --
> > > >> > > Para escribir al Grupo, hágalo a esta dirección:
> > > >> > > [email protected]
> > > >> > > Para más, visite:
> http://groups.google.com/group/NHibernate-Hispano
> >
> > > >> > --
> > > >> > Fabio Maulo
> >
> > > >> --
> > > >> Para escribir al Grupo, hágalo a esta dirección:
> > > >> [email protected]
> > > >> Para más, visite:http://groups.google.com/group/NHibernate-Hispano
> >
> > > >  --
> > > > Para escribir al Grupo, hágalo a esta dirección:
> > > > [email protected]
> > > > Para más,
> >
> > ...
> >
> > leer más »
>
> --
> Para escribir al Grupo, hágalo a esta dirección:
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a