Matias, Los many-to-one son lazy por defecto, por lo que ninguna de tus preocupaciones aplica.
Diego 2010/5/18 Matias Veleda <[email protected]> > Hola Diego, > > antes que nada gracias por tu ayuda. Quería comentarte lo siguiente > respecto a mapear la clave de esa manera que me anduvo dando vueltas. > En este caso la entidad Actividad tiene bastantes colecciones y > propiedades y como ese ejemplo hay otros dentro de la aplicación. Mi > pregunta es la siguiente, no sería demasiada información a retener > dentro de una clave compuesta? No sería mejor tenes los datos > primitivos necesarios para armar la clave? De esa manera mi ObjetivoId > tendría internamente una referencia a la Actividad, y solamente para > tener el Id del Objetivo, estaría levantando mucha información que no > es necesaria. Y otra cosa que tenia duda que no se si es correcto, es > que en las documentaciones proponen que las claves compuestas sean > serializables; si mi entidad Actividad en este caso, tiene colecciones > del tipo IList, estas no serían serializables. > Es muy errado lo que estoy planteando? Es algo para tener en cuenta? > Gracias! > > Saludos, > > Matias.- > > On 18 mayo, 10:54, Diego Mijelshon <[email protected]> wrote: > > El primer problema que tienes es que el Id de Objetivo no está > especificando > > la foreign key que posee. > > Yo la declararía así: > > > > <composite-id name="Id" class="ObjetivoId"> > > <key-many-to-one name="Actividad"> > > <column name="ID_PROGRAMA" sql-type="VARCHAR2(10)" /> > > <column name="ID_ACTIVIDAD" sql-type="VARCHAR2(10)" /> > > </key-many-to-one> > > <key-property name="IdObjetivo" length="10"> > > <column name="ID_OBJETIVO" sql-type="VARCHAR2(10)" /> > > </key-property> > > </composite-id> > > > > Y, por supuesto, reemplazas las propiedades sueltas con una referencia a > > Actividad que debes asignar antes de grabar. > > Empieza con eso y vemos qué sucede. > > > > Diego > > > > 2010/5/18 Matias Veleda <[email protected]> > > > > > > > > > Hola Diego, > > > > > Acá te dejo parte del mapping que me ha traido problemas: > > > > > <class name="Actividad" table="M4_ACTIVIDADES"> > > > > > <composite-id name="Id" class="ActividadId"> > > > <key-property name="IdPrograma" length="10"> > > > <column name="ID_PROGRAMA" > > > sql-type="VARCHAR2(10)" /> > > > </key-property> > > > <key-property name="IdActividad" length="10"> > > > <column name="ID_ACTIVIDAD" > > > sql-type="VARCHAR2(10)" /> > > > </key-property> > > > </composite-id> > > > > > ... > > > > > <bag name="ListaObjetivos" > table="M4_ACTIVIDADES_OBJETIVOS" > > > lazy="true" cascade="all-delete-orphan" inverse="true"> > > > <key> > > > <column name="ID_PROGRAMA"/> > > > <column name="ID_ACTIVIDAD"/> > > > </key> > > > <one-to-many class="Objetivo"/> > > > </bag> > > > > > ... > > > </class> > > > > > <class name="Objetivo" table="M4_ACTIVIDADES_OBJETIVOS"> > > > > > <composite-id name="Id" class="ObjetivoId"> > > > <key-property name="IdPrograma" length="10"> > > > <column name="ID_PROGRAMA" > > > sql-type="VARCHAR2(10)" /> > > > </key-property> > > > <key-property name="IdActividad" length="10"> > > > <column name="ID_ACTIVIDAD" > > > sql-type="VARCHAR2(10)" /> > > > </key-property> > > > <key-property name="IdObjetivo" length="10"> > > > <column name="ID_OBJETIVO" > > > sql-type="VARCHAR2(10)" /> > > > </key-property> > > > </composite-id> > > > > > <property name="NombreEsp"> > > > <column name="N_OBJETIVO_ESP" length="100" > > > sql-type="VARCHAR2(100)"/ > > > > > </property> > > > > > ... > > > > > </class> > > > > > En este caso, la Actividad la persiste sin problemas, sea un caso o el > > > otro pero al llegar a la colección de Objetivos no puede determinar > > > qué debe hacer con cada uno. Desde ya muchas gracias. > > > > > Saludos, > > > > > Matias.- > > > > > On 18 mayo, 08:25, Diego Mijelshon <[email protected]> wrote: > > > > Matías, > > > > Mandá un ejemplo de clase padre e hijo con sus mappings con los que > > > tengas > > > > problemas. > > > > > > Diego > > > > > > 2010/5/18 Matias Veleda <[email protected]> > > > > > > > Hola, > > > > > > > Les cuento la situación en la que me encuentro a ver si pueden > > > > > ayudarme o guiarme un poco en la solución. Tengo una aplicación que > > > > > tiene que lidiar con una base de datos ya diseñada y en > funcionamiento > > > > > desde hace rato. No tengo demasiada autonomía sobre la BD ya que > > > > > además es usada y administrada por otras aplicaciones como META4 > por > > > > > ejemplo. > > > > > El tema en este caso son las claves compuestas. Se que no es > > > > > recomendado utilizarlas y que de alguna manera es alejarse del > diseño > > > > > de objetos y acercarse al diseño de bases de datos, pero en este > caso > > > > > (y contra mi voluntad) digamos que tengo que respetar estas claves > > > > > compuestas. > > > > > El problema se presenta en qué NH no se da cuenta cuando es una > > > > > inserción o cuando es una actualización, de manera que, después de > > > > > investigar un poco en internet buscando alternativas encontré que > la > > > > > mayoria proponen diferenciar a mano si es un Update() o un Save(). > > > > > Ahora bien, algunas entidades obviamente funcionaron bien, pero me > > > > > pasa que cuando tengo entidades padre (cuya clave es compuesta) que > > > > > tienen hijos (cuyas claves son compuestas también) que al querer > > > > > persistir los hijos me da error, al parecer porque no puede > > > > > identificar si debe hacer un Update() o un Save() con ellos. Es > decir, > > > > > el padre lo podría persistir correctamente pero al llegar a los > hijos > > > > > falla. > > > > > A alguno le ha tocado lidiar con este tema? Y si es asi, qué > > > > > soluciones encontraron? Una posible solución podría ser eliminar > los > > > > > Cascades y realizar el mismo mecanismo manual con los hijos, es > decir, > > > > > verificar si existen ya en la BD, y determinar si es Update() o > > > > > Save(). Esto calculo va a funcionar pero por ahi hay alternativas > > > > > mejores. > > > > > > > Perdón lo extenso del planteo, y si algo no quedó claro me dicen e > > > > > intento explicarlo mejor. Desde ya muchas gracias por cualquier > dato > > > > > que me puedan compartir para darle una solución viable a este tema. > > > > > > > Saludos, > > > > > > > Matias.- > > > > > > > -- > > > > > 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 > > > > -- > > 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
