Clases y mapeo para una tabla con clave compuesta

153 views
Skip to first unread message

Uribe

unread,
Oct 1, 2008, 4:08:52 AM10/1/08
to NHibernate-Hispano
Hola, tengo el siguiente problema. Tengo una relación entre tres
tablas de la siguiente manera:

TABLA A: claveA
atributos_tabla_a

TABLA B: claveA
claveC
atributos

TABLA C: claveC
atributos_tabla_b

La relación entre estas es:
TABLA A con TABLA B se enlazan mediante claveA de 1 a muchos (one-to-
many)
TABLA B con TABLA C se enlazan mediante claveC de muchos a 1 (many-to-
one)

El problema que tengo es a la hora de mapear y crear la clase
correspondiente a la TABLA B, ya que tanto claveA como claveC son
claves primarias en la tabla (tengo que mapear esta tabla porque
contiene otros campos que me resultan necesarios para el
funcionamiento de la aplicación [atributos]).

He intentado hacerlo mediante <composite-id> de la siguiente manera:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="ClaseDeLaTABLA_B" table="TABLA_B" lazy="false">
<composite-id name="Id" class="ClaseDeLaTABLA_B+ClavePrimaria">
<key-property name="CLAVE_A" type="System.String"
column="clave_a"/>
<key-property name="CLAVE_C" type="System.String"
column="clave_c"/>
</composite-id>

<property name="Atributos" column="atributos" />

<many-to-one name="A" column="clave_a" class="ClaseDeLaTABLA_A"
not-null="true" />
<many-to-one name="C" column="clave_c" class="ClaseDeLaTABLA_C"
not-null="true" />

</class>
</hibernate-mapping>

¿Podeis ayudarme y decirme si este archivo de mapeo es correcto?,
además ¿Como podría hacer la clase para poder utilizarla en la
aplicación, teniendo en cuenta que tengo que insertar nuevos
registros, es decir, poder modificar esta id compuesta?

Muchas gracias.

Un saludo, Rubén Uribe.

XMANU

unread,
Oct 1, 2008, 7:20:14 AM10/1/08
to NHibernat...@googlegroups.com
El mapeo debiera quedar algo asi:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
 <class name="ClaseDeLaTABLA_B" table="TABLA_B" lazy="false">
   <composite-id name="Id" class="ClaseDeLaClavedeTABLA_B">
     <key-many-to-one="CLAVE_A" class="ClaseA"
column="clave_a"/>
     <key-many-to-one="CLAVE_C" class="ClaseC"
column="clave_c"/>
   </composite-id>
<property name="Atributos" column="atributos" />
 </class>
</hibernate-mapping>

Ademas debes definir una clase para el ID de la ClaseB

public class ClaseDeLaClavedeTABLA_B
{
   public ClaseA ClaseA {get;set}
   public ClaseB ClaseB {get;set;}
}

2008/10/1 Uribe <uribe_ai...@hotmail.com>

Fabio Maulo

unread,
Oct 1, 2008, 7:46:17 AM10/1/08
to NHibernat...@googlegroups.com
De todas formas, si no se trata di adaptarse a algo ya existente, vendría bien evitar ID compuestos.
--
Fabio Maulo

Uribe

unread,
Oct 2, 2008, 9:56:59 AM10/2/08
to NHibernate-Hispano
Hola, al final conseguí hacerlo definiendo una clase para la ID
compuesta y haciendo un par de cambios. Gracias por vuestra ayuda.

PD: Fabio, créeme que si no tuviese adaptarme a algo ya hecho no
habría usado una clave compuesta, pero ya estaba hecho y no podía
modificarlo :P.

Gracias.

Un saludo.

Fabio Maulo

unread,
Oct 2, 2008, 10:42:07 AM10/2/08
to NHibernat...@googlegroups.com
El 2 de octubre de 2008 10:56, Uribe <uribe_ai...@hotmail.com> escribió:

Hola, al final conseguí hacerlo definiendo una clase para la ID
compuesta y haciendo un par de cambios. Gracias por vuestra ayuda.

Yo no te pregunté porque siempre tendrías que tener una clase especifica para el ID; es la mejor forma de hacerlo.
composite-id = id en un component
Disculpame... otra vez culpa del sindrome del obvio.

Acordate de implementar tambien Equals y GetHashCode de esa clase.

--
Fabio Maulo
Reply all
Reply to author
Forward
0 new messages