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

Responder a