Bueno, ingresar rapido o no depende un poco de que tenes hasta ahora. No siempre es facil cambiar de estrategia si el orden no se adapta a la logica de lo que tenes hecho. En el caso de conversation si lo que inyectas en los repositorios es el sessionfactory es muy facil (es la mejor manera de trabajar con multiples bases de datos de manera ordenada esta)
La gran sesion es un gran peligro. El acceso a las lineas lo hubieras obtenido si hubieras usado fetch join en el caso de HQL o eager load en criteria o directamente lazy=false si para todos los casos de uso necesitas el elemento. Empezar a hacer roundtrips a la base con lazy es peligroso, la idea es que si en un caso de uso lo necesitas usas una estrategia de fetch eager y si no lo necesitas no haces nada... Por ahi la magia de NH... En el ejemplo que tengo de sessionManagement en uNHAddins estoy usando los objetos de dominio en el form, y mantengo una conversacion a la que paso los objetos de un lado a otro hasta que se termina. En mi caso en produccion en general trabajo con DTO's que implementan las estrategias de binding de Winforms o WPF o lo que este usando y por tanto no uso todas las maravillas de NH durante el trabajo en el Form...esto tiene pros y contras. Mi estrategia de DTO fue tomada cuando no tenia forma de trabajar con conversacion, ahora estoy evaluando todavia si usare eso o no...todavia soy mas tendiente a eso, porquen o me gusta que mis objetos de dominio tengan que implementar cosas de Binding...pero en algunos proyectos puede ser util... Gustavo. 009/1/12 Raul Lopez <[email protected]> > > Gustavo, actualmente abro la sesion en el constructor del presenter y la > paso como argumento cuando accedo al repositorio. > De esa forma tengo una "gran sesion". En principio tenía una sesion por > acceso al repositorio, pero el problema era que al traer un objeto factura > p.ej, al cerrar la sesion a la vuelta del repositorio perdia el acceso a las > lineas por el tema del lazy. > De todos modos esta estrategia me esta dando problemas, como el de los > commits que mencionas. > Me interesa lo uNHAddins. Es algo que se pueda incorporar en una forma > relativamente rápida? > > Saludos, > Raul. > > Gustavo Ringel escribió: > > Raul, a la primer excepcion que te de la sesion tenes que tirar el form > > con esa estrategia. > > Si haces algo en un background worker no puede usar la sesion que > > iniciaste en el constructor. > > Si haces algo en un timer no podes usar la sesion que iniciaste en el > > constructor. > > Idem para threads. > > > > Es decir, no vas a estar contento rapidamente. > > > > Una solucion relativamente "rapida" es usar un presenter y que el > > presenter sea el encargado de hacer opensession en cada funcion llama a > > los servicios/repositorios encargados de realizar un caso de uso y > commitea. > > > > Obviamente el problema que tenes aca es que pasa si lo que queres es > > abrir una orden agregar algunas lineas, etc, todo en la misma > > conversacion de manera que todo lo que hiciste se commitee o solo una > parte. > > > > Es decir, en lo que dije antes si abris la orden commitea, luego creas > > algunass lineas se commitean, luego tenes algun problema...y ups, no > > podes abortar, tenes que borrar a mano. > > En el patron de conversacion de uNHAddins con una estrategia razonable > > para el id (no identity obviamente sino cualquier otra :)) podes volver > > atras toda la conversacion... > > > > Saludos. > > > > Gustavo. > > > > 2009/1/12 Raul Lopez <[email protected] <mailto: > [email protected]>> > > > > > > Carlos, estoy usando algo asi donde _session es global y aplico > > NHibernateSessionFactory.OpenSession() en el constructor. > > En principio funciona, ahora voy a ver que pasa cuando traslade este > > tema de parent-child a la aplicacion real. > > Si se me complica aviso :) > > > > Saludos, > > Raul. > > > > > > Carlos Peix escribió: > > > Hola Raul, > > > > > > Normalmente no uso winforms pero por ahí este patron podria > > funcionarte: > > > > > > using ( ITransaction tx = _session.BeginTransaction() ) > > > { > > > // Aquí haces todas tus actualizaciones > > > > > > tx.Commit(); > > > } > > > > > > Donde _seesion es la variable de instancia del form, ahí tenes la > > sesion > > > abierta y tenes un scope bien limitado para la transaccion. > > > > > > En cuanto a esto: > > >> - Estas agregando LA MISMA INSTANCIA de chuild a todos los > > parents, me > > >> parece que eso no es lo que queres hacer. > > > a los efectos de la prueba me parecio que no era relevante, > pero... > > > > > > [Carlos] Creo que es muy relevante porque en el Child tenes una > > referencia > > > al parent, lo cual invalida que un child pueda pertenecer a > > varios parents. > > > Incluso diria que este es el motico por el cual te quedaba un > > child asociado > > > a un solo parent (el ultimo), supondiendo que estuvieras haciendo > la > > > referencia al parent, cosa que no se ve en tu codigo. > > > > > > > > > Suerte > > > > > > Carlos Peix > > > > > > -----Mensaje original----- > > > De: [email protected] > > <mailto:[email protected]> > > > [mailto:[email protected] > > <mailto:[email protected]>] En nombre de Raul > Lopez > > > Enviado el: Lunes, 12 de Enero de 2009 11:44 a.m. > > > Para: [email protected] > > <mailto:[email protected]> > > > Asunto: [NHibernate-Hispano] Re: ayuda con coleccion > > > > > > > > > Hola Carlos, en efecto habia varias cosas mal (lo copie > > correctamente al > > > mail). Probe con tu codigo y funciona. > > > Te comento conclusiones entre lineas: > > > > > > Carlos Peix escribió: > > >> Hola Raul, > > >> > > >> Hay varias cosas en tu ejemplo que no estan bien, no se si porque > lo > > >> copiaste incorrectamente al mail o porque estan definitivamente > mal. > > >> Te pido que reescribas tu codigo de esta manera (y que cambies > > lo que > > >> corresponda siempre y cuando entiendas los motivos). Estos son > los > > >> puntos que no me cierran > > >> > > >> - No queda claro el scope de la variable _session. > > > es global para todo el form > > > > > >> - Estas agregando LA MISMA INSTANCIA de chuild a todos los > > parents, me > > >> parece que eso no es lo que queres hacer. > > > a los efectos de la prueba me parecio que no era relevante, > pero... > > > > > >> - Veo una propiedad Parent en el child que no estas seteando en > el > > >> codigo que enviaste. > > > fue omision, no lo vi > > > > > >> - Estas haciendo un update con cada parent, esto no seria > necesaro, > > >> incluso no es necesario hacer ninguno con la opcion de cascade > > que tenes. > > > de acuerdo, esta de mas > > > > > >> // Aca achicas mucho mas el scope de session, el metodo // > > >> CreateSession() depende de cómo manejes e sessionFactory // pero > > >> deberia ser una sesion nueva puesto que estas haciendo // el > Dispose > > >> al salir del using(), esa sesion no servira para // nada mas. > > > > > > aca no hay problema, pero en el programa real se me complica si > > no hago la > > > sesion global (tengo lio con el lazy) Voy a estudiar mas sobre el > > tema del > > > manejo de las sesiones. > > > > > > Muchas gracias una vez mas. > > > > > > Saludos, > > > Raul. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --~--~---------~--~----~------------~-------~--~----~ Para escribir al Grupo, hágalo a esta dirección: [email protected] Para más, visite: http://groups.google.com/group/NHibernate-Hispano -~----------~----~----~----~------~----~------~--~---
