Problema en many-to-many Hibernate

nicokiki
07 de Febrero del 2006
Hola!!!
Estoy teniendo un problema con un mapeo de many-to-many. Es un problema q vi a partir de una busqueda en google q era un bug de Hibernate, pero en algun txt de la release 2 de Hibernate dice estar solucionado, pero estoy usando la 3 y no me anda.... Les paso las tablas:

TABLE Carrera {
id_carrera: PK
....
}

TABLE Materia {
id_materia: PK
id_carrera: PK
id_departamento: FK
....
}

TABLE Departamento {
id_departamento: PK
....
}

TABLE Integracion {
id_materia: PK
id_carrera: PK
id_materia_padre : PK
}

"id_materia_padre" se refiere a "id_materia" en la tabla "Materia"..


"Integracion" es la relacion "many-to-many" entre "Materia" y "Materia" (ambas entidades son las mismas).
Salta una exception desde el principio:

org.hibernate.MappingException:
Repeated column in mapping for collection: com.epidataconsulting.test.Materia.materiasCorrelativas column: ID_CARRERA

Les paso el codigo del .java:
Materia.java:
public class Materia implements Serializable {

private int id;
private String nombre;
private int creditos;
private String contMin;
private String objetivo;
private Departamento departamento;
private Set materiasCorrelativas = new HashSet();
private Carrera carrera;

.....

}

Mapping file: (Materia.hbm.xml)
<hibernate-mapping package="com.epidataconsulting.test">

<class name="Materia" table="MATERIA">

<composite-id>
<key-property name="id" column="ID" type="integer" />
<key-many-to-one name="carrera" class="Carrera" column="ID_CARRERA"/>
</composite-id>

<property name="nombre" column="NOMBRE" type="string" length="20" />
<property name="creditos" column="CREDITOS" type="integer" />
<property name="contMin" column="CONT_MIN" type="string" length="20" />
<property name="objetivo" column="OBJETIVO" type="string" length="20" />

<many-to-one name="departamento" class="Departamento"
cascade="all" outer-join="auto" not-null="true"
fetch="join" column="ID_DEPARTAMENTO" />

<many-to-one name="carrera" class="Carrera"
cascade="none" outer-join="auto"
column="ID_CARRERA" not-null="true"
fetch="join" />

<set name="materiasCorrelativas" table="MATERIA_CARRERA" inverse="true">
<key >
<column name="ID_MATERIA" />
<column name="ID_CARRERA" />
</key>
<many-to-many class="Materia">
<column name="ID_MATERIA_PADRE"/>
<column name="ID_CARRERA" />
</many-to-many>
</set>

</class>

</hibernate-mapping>

Hay alguna manera de resolver este mapeo?? En algun resultado de google vi q una opcion seria cambiar el nombre de una de las columnas de una de las entidades, pero en mi caso es imposible porque ambas entidades son las mismas....

A alguien le paso???

Salu2!!!!

nicokiki
07 de Febrero del 2006
Hola!!!

En DesarrolloJava de Yahoo me dieron la respuesta.
Lo q hay q hacer es en la parte del mapeo usar FORMULA en vez de COLUMN para asi "engañar" a Hibernate y q NO se confunda los nombres de las columnas....

<set name="materiasCorrelativas" table="MATERIA_CARRERA" cascade="all" >
<key >
<column name="ID_MATERIA" />
<column name="ID_CARRERA" />
</key>
<many-to-many class="Materia" >
<column name="ID_MATERIA_PADRE"/>
<formula >ID_CARRERA</formula>
</many-to-many>
</set>

Salu!! y espero q le sirva a alguien