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
