Mapeo de Clave compuesta Hibernate

374 views
Skip to first unread message

Jesus Calzado :)

unread,
Feb 3, 2009, 11:55:13 AM2/3/09
to JavaSOS
Tengo en mi base da deatos una Cursopro que tiene una clave compuesta
por el Codigo de un curso y un Semestre, el codigo del curso es una
calve foranea de otra tabla Curso cuyo unica clave primaria es su
propio codigo(no tiene clave compuesta), el semestre no es una clave
foranea, es un string que se le seteara al crear el Curso pro,
siguiendo esto estuve navegnado y viendo como se mapea las claves
compuestas y la puse asi

package pe.edu.modelo;
import java.util.HashSet;
import java.util.Set;
public class Curso implements java.io.Serializable {
private String codCurso;
private String nomCurso;
private Integer credCurso;
private Integer hrsTeoria;
private Integer hrsPract;
private Integer hrsLab;
private Integer ciclo;
private Integer tipoCurso;
private Set cursopros = new HashSet(0);

public Curso() {
}

public Curso(String codCurso) { this.codCurso = codCurso;}

public Curso(String codCurso, String nomCurso, Integer credCurso,
Integer hrsTeoria, Integer hrsPract, Integer hrsLab, Integer ciclo,
Integer tipoCurso, Set cursopros) {
this.codCurso = codCurso;
this.nomCurso = nomCurso;
this.credCurso = credCurso;
this.hrsTeoria = hrsTeoria;
this.hrsPract = hrsPract;
this.hrsLab = hrsLab;
this.ciclo = ciclo;
this.tipoCurso = tipoCurso;
this.cursopros = cursopros;
}

public String getCodCurso() {return this.codCurso;}
public void setCodCurso(String codCurso) {this.codCurso = codCurso;}
public String getNomCurso() {return this.nomCurso;}
public void setNomCurso(String nomCurso) {this.nomCurso = nomCurso;}
public Integer getCredCurso() { return this.credCurso;}
public void setCredCurso(Integer credCurso) {this.credCurso =
credCurso;}
public Integer getHrsTeoria() {return this.hrsTeoria;}
public void setHrsTeoria(Integer hrsTeoria) {this.hrsTeoria =
hrsTeoria;}
public Integer getHrsPract() {return this.hrsPract;}
public void setHrsPract(Integer hrsPract) {this.hrsPract = hrsPract;}
public Integer getHrsLab() {return this.hrsLab;}
public void setHrsLab(Integer hrsLab) { this.hrsLab = hrsLab;}
public Integer getCiclo() {return this.ciclo;}
public void setCiclo(Integer ciclo) {this.ciclo = ciclo;}
public Integer getTipoCurso() { return this.tipoCurso;}
public void setTipoCurso(Integer tipoCurso) {this.tipoCurso =
tipoCurso;}
public Set getCursopros() {return this.cursopros;}
public void setCursopros(Set cursopros) {this.cursopros = cursopros;}
}
package pe.edu.modelo;

import pe.edu.modelo.*;

public class Cursopro implements java.io.Serializable {

private CursoproId id;
private Aula aula;
private Profesor profesor;
private Integer turno;
private String seccion;
private Integer numMatr;
private Integer capMax;
private Integer genParc;
private Integer genFin;
private String horario;

public Cursopro() {
}

public Cursopro(CursoproId id, Aula aula, Profesor profesor,
String horario) {
this.id = id;

this.aula = aula;
this.profesor = profesor;
this.horario = horario;
}

public Cursopro(CursoproId id, Aula aula, Profesor profesor,
Integer turno, String seccion, Integer numMatr, Integer capMax,
Integer genParc, Integer genFin, String horario) {
this.id = id;
this.aula = aula;
this.profesor = profesor;
this.turno = turno;
this.seccion = seccion;
this.numMatr = numMatr;
this.capMax = capMax;
this.genParc = genParc;
this.genFin = genFin;
this.horario = horario;
}

public CursoproId getId() {return this.id;}
public void setId(CursoproId id) {this.id = id;}
public Aula getAula() { return this.aula;}
public void setAula(Aula aula) {this.aula = aula;}
public Profesor getProfesor() {return this.profesor;}
public void setProfesor(Profesor profesor) {this.profesor =
profesor;}
public Integer getTurno() {return this.turno;}
public void setTurno(Integer turno) {this.turno = turno;}
public String getSeccion() {return this.seccion;}
public void setSeccion(String seccion) {this.seccion = seccion;}
public Integer getNumMatr() {return this.numMatr;}
public void setNumMatr(Integer numMatr) {this.numMatr = numMatr;}
public Integer getCapMax() {return this.capMax;}
public void setCapMax(Integer capMax) {this.capMax = capMax;}
public Integer getGenParc() {return this.genParc;}
public void setGenParc(Integer genParc) {this.genParc = genParc;}
public Integer getGenFin() {return this.genFin;}
public void setGenFin(Integer genFin) {this.genFin = genFin;}
public String getHorario() {return this.horario;}
public void setHorario(String horario) {this.horario = horario;}

}

package pe.edu.modelo;
import pe.edu.modelo.*;
public class CursoproId implements java.io.Serializable {

private String semestre;
private Curso curso;
public CursoproId() {}
public CursoproId(String semestre, Curso Curso) {
this.semestre = semestre;
this.curso = Curso;
}
public String getSemestre() {return this.semestre;}
public void setSemestre(String semestre) {this.semestre = semestre;}
public Curso getCurso() {return this.curso;}
public void setCodCurso(Curso curso) {this.curso = curso;}
public boolean equals(Object other) {
if ((this == other))
return true;
if ((other == null))
return false;
if (!(other instanceof CursoproId))
return false;
CursoproId castOther = (CursoproId) other;

return ((this.getSemestre() == castOther.getSemestre()) || (this
.getSemestre() != null
&& castOther.getSemestre() != null && this.getSemestre()
.equals(castOther.getSemestre())))
&& ((this.getCurso() == castOther.getCurso()) || (this
.getCurso() != null
&& castOther.getCurso() != null && this
.getCurso().equals(castOther.getCurso())));
}
public int hashCode() {
int result = 17;
result = 37 * result
+ (getSemestre() == null ? 0 : this.getSemestre().hashCode());
result = 37 * result
+ (getCurso() == null ? 0 : this.getCurso().hashCode());
return result;
}

}
mi archivo de mapeo para Cursopro.hbm.xml es esta:
<hibernate-mapping>
<class name="pe.edu.modelo.Cursopro" table="CURSOPRO" schema="dbo"
catalog="Academico">
<composite-id name="id" class="pe.edu.modelo.CursoproId">
<key-property name="semestre" type="string">
<column name="SEMESTRE" length="30" />
</key-property>
<key-many-to-one name="curso" class="pe.edu.modelo.Curso">
<column name="COD_CURSO" length="30" />
</key-many-to-one>
</composite-id>
<many-to-one name="aula" class="pe.edu.modelo.Aula"
fetch="select">
<column name="COD_AULA" length="30" not-null="true" />
</many-to-one>
<many-to-one name="profesor" class="pe.edu.modelo.Profesor"
fetch="select">
<column name="COD_PROF" length="30" not-null="true" />
</many-to-one>
<property name="turno" type="java.lang.Integer">
<column name="TURNO" />
</property>
<property name="seccion" type="string">
<column name="SECCION" length="30" />
</property>
<property name="numMatr" type="java.lang.Integer">
<column name="NUM_MATR" />
</property>
<property name="capMax" type="java.lang.Integer">
<column name="CAP_MAX" />
</property>
<property name="genParc" type="java.lang.Integer">
<column name="GEN_PARC" />
</property>
<property name="genFin" type="java.lang.Integer">
<column name="GEN_FIN" />
</property>
<property name="horario" type="string">
<column name="HORARIO" length="30" not-null="true" />
</property>
</class>
</hibernate-mapping>
y para Curso.hbm.xml
<hibernate-mapping>
<class name="pe.edu.modelo.Curso" table="CURSO" schema="dbo"
catalog="Academico">
<id name="codCurso" type="string">
<column name="COD_CURSO" length="30" />
<generator class="assigned" />
</id>
<property name="nomCurso" type="string">
<column name="NOM_CURSO" length="30" />
</property>
<property name="credCurso" type="java.lang.Integer">
<column name="CRED_CURSO" />
</property>
<property name="hrsTeoria" type="java.lang.Integer">
<column name="HRS_TEORIA" />
</property>
<property name="hrsPract" type="java.lang.Integer">
<column name="HRS_PRACT" />
</property>
<property name="hrsLab" type="java.lang.Integer">
<column name="HRS_LAB" />
</property>
<property name="ciclo" type="java.lang.Integer">
<column name="CICLO" />
</property>
<property name="tipoCurso" type="java.lang.Integer">
<column name="TIPO_CURSO" />
</property>
<set name="cursopros" inverse="true">
<key>
<column name="COD_CURSO" length="30" not-null="true" /
>
</key>
<one-to-many class="Cursopro" />
</set>
</class>
</hibernate-mapping>

La traza que me bota es esta:
Initial SessionFactory creation failed.org.hibernate.MappingException:
Association references unmapped class: Cursopro
Exception in thread "main" java.lang.ExceptionInInitializerError
at pe.edu.daohibernate.FactorySesiones.<clinit>(FactorySesiones.java:
13)
at pe.edu.daohibernate.AlumnoDAOHibernate.<clinit>
(AlumnoDAOHibernate.java:21)
at pe.edu.service.implementacion.AlumnoServiceImplementacion.<init>
(AlumnoServiceImplementacion.java:20)
at pe.edu.vistaporconsola.Test.main(Test.java:11)
Caused by: org.hibernate.MappingException: Association references
unmapped class: Cursopro
at org.hibernate.cfg.HbmBinder.bindCollectionSecondPass
(HbmBinder.java:2341)
at org.hibernate.cfg.HbmBinder$CollectionSecondPass.secondPass
(HbmBinder.java:2620)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass
(CollectionSecondPass.java:35)
at org.hibernate.cfg.Configuration.secondPassCompile
(Configuration.java:1049)
at org.hibernate.cfg.Configuration.buildSessionFactory
(Configuration.java:1205)
at pe.edu.daohibernate.FactorySesiones.<clinit>(FactorySesiones.java:
10)
... 3 more
No entiendo la verdad porque si en mi archivo hibernate.cfg.xml
comento el mapping para esta clase,curso y algunas otras puedo correr
la aplicacion, que dato me falta

Pablo Ruggia

unread,
Feb 3, 2009, 12:08:32 PM2/3/09
to jav...@googlegroups.com
Como te dije en el mail anterior, las clases en los mapeos van con el paquete entero
pone.tu.paquete.adelante.Cursopro
Saludos !

PD: mas alla de eso, en vez de usar claves compuestas, siempre que puedas ponele una columna ID y usa eso como PK, el resto ponelo como FK y listo, te vas a hacer la vida mucho mas sencilla.

Santiago Risaro

unread,
Feb 3, 2009, 12:48:34 PM2/3/09
to jav...@googlegroups.com
Asegurate que en hibernate.cfg cursopro esté antes que la clase que está procesando al momento que lanza la excepción.

Pablo, me imagino que habrás querido decir UK en lugar de FK.

Saludos.

Pablo Ruggia

unread,
Feb 3, 2009, 12:53:23 PM2/3/09
to jav...@googlegroups.com
Quise decir las dos cosas en realidad, si, las dos columnas formarian una sola UK, y ademas una de las columnas en tu caso es una FK y la otra no.

Jesus Calzado :)

unread,
Feb 4, 2009, 3:37:29 PM2/4/09
to JavaSOS
A te refieres a esto :
<one-to-many class="Cursopro" /> *****Aqui esta el
problema ****
</set>
</class>
</hibernate-mapping>
Bueno voy a intentarlo disculpen que redunde la verdad me confie
bastante de la perspectiva de eclipse que mi hizo la ingenieria
inversa , lo voy a corregir a ver que pasa


On 3 feb, 12:53, Pablo Ruggia <prug...@gmail.com> wrote:
> Quise decir las dos cosas en realidad, si, las dos columnas formarian una
> sola UK, y ademas una de las columnas en tu caso es una FK y la otra no.
>
>
>
> On Tue, Feb 3, 2009 at 3:48 PM, Santiago Risaro <nris...@gmail.com> wrote:
> > Asegurate que en hibernate.cfg cursopro esté antes que la clase que está
> > procesando al momento que lanza la excepción.
>
> > Pablo, me imagino que habrás querido decir UK en lugar de FK.
>
> > Saludos.
>
> > On Tue, Feb 3, 2009 at 3:08 PM, Pablo Ruggia <prug...@gmail.com> wrote:
>
> >> Como te dije en el mail anterior, las clases en los mapeos van con el
> >> paquete entero
> >> pone.tu.paquete.adelante.Cursopro
> >> Saludos !
>
> >> PD: mas alla de eso, en vez de usar claves compuestas, siempre que puedas
> >> ponele una columna ID y usa eso como PK, el resto ponelo como FK y listo, te
> >> vas a hacer la vida mucho mas sencilla.
>
> ...
>
> leer más »- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -
Reply all
Reply to author
Forward
0 new messages