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, 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