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

Responder a