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
