Si Nestor, yo también lo tengo entendido así, lo que hace es un Flush,
una de las razones por las que se puede lanzar el Flush es por la
ejecución de una consulta.

Bien, estoy también de acuerdo contigo y con Fabio, no debo confundir
los eventos de persistencia o de NHibernate con los eventos de mi
Negocio.

Por otro lado, gracias al screencast he entendido perfectamente las
distintas implementaciones de POID, creo que HiLo es la más
conveniente para mi sistema, en algunas ocasiones he pensado en usar
un ID único para todas mis entidades, pero no lo había hecho por miedo
a que se gastaran, nunca había hecho la cuenta, pero "creo" que dentro
de 5000 años estaré viejo para que me llamen a arreglarlo :P

Muchas gracias a todos, esto me ha servido de mucho.

Ciao.

On 23 nov, 17:56, Nestor Rodriguez <[email protected]> wrote:
> 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-listen...
>
> > 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
>
> ...
>
> 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

Responder a