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