Hello, I need your help. I don't know why getter don't work fine.
I have multiple relation many-to-one
Alumno --- one-to-many --- FormasRptas
Ramo --- one-to-many --- FormasRptas
Forma --- one-to-many --- FormasRptas
Ramo --- many-to-many --- Alumno
For example, I load 3 entities, they have relation with FormasRptas:
Alumno al = (Alumno) sess.load(Alumno.class, idAl);
Ramo r = (Ramo) sess.load(Ramo.class, idRamo);
Forma f = (Forma) sess.load(Forma.class, idForma);
and I create one entity FormaRpta
FormaRpta fr = new FormaRpta();
and I put propieties. Next, I call getter:
al.getFormas_rptas().add(fr);
and it's work's fine, but when I call
r.getFormas_rptas().add(fr);
this don't work and
f.getFormas_rptas().add(fr);
this don't work :( . When I call
al.getFormas_rptas().iterator();
work's fine too, but
r.getFormas_rptas().iterator();
and
f.getFormas_rptas().iterator();
don't. what is wrong in getters of Ramo and Forma??? Relations are wrong??? Please, help me, because I don't understand why!!!
Paola
Hibernate version: Hibernate 3.1.3
Mapping documents:
This is Persona.hbm.xml (Alumno is a subclass)
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="encuestas.Persona"
table="PERSONA"
lazy="true"
abstract="true">
<id name="id"
type="long"
column="PERSONA_ID">
<generator class="native"/>
</id>
<property name="rut"
type="long"
not-null="true">
<column name="RUT"/>
</property>
<joined-subclass name="encuestas.Alumno" table="ALUMNO">
<key column="ALUMNO_ID"/>
<property name="password"
type="string"
not-null="true">
<column name="PASSW"/>
</property>
<set name="Formas_rptas"
lazy="true"
inverse="true"
cascade="delete" >
<key>
<column name="alumnoID" />
</key>
<one-to-many class="encuestas.FormaRpta"/>
</set>
<set name="ramos" lazy="true" table="ALUMNO_RAMO">
<key column="alumnoID"/>
<composite-element class="encuestas.AlumnoRamo">
<parent name="alumno"/>
<many-to-one name="ramo"
class="encuestas.Ramo"
column="ramoID"
not-null="true"/>
<property name="semestre" column="SEMESTRE" not-null="true"/>
<property name="agno" column="AGNO" not-null="true"/>
<property name="estado" column="ESTADO" not-null="true"/>
</composite-element>
</set>
</joined-subclass>
</class>
</hibernate-mapping>
This is Ramo.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="encuestas.Ramo" table="RAMO">
<id name="id" type="long" column="ID">
<!-- <meta attribute="finder-method">findByID</meta> -->
<generator class="native"/>
</id>
<property name="nombre"
type="string"
not-null="true">
<column name="NOMBRE"/>
</property>
<set name="Formas_rptas"
lazy="true"
inverse="true"
cascade="delete" >
<key>
<column name="ramoID" />
</key>
<one-to-many class="encuestas.FormaRpta"/>
</set>
</class>
</hibernate-mapping>
This is Forma.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="encuestas.Forma" table="FORMA">
<id name="id" type="long" column="ID">
<!-- <meta attribute="finder-method">findByID</meta> -->
<generator class="native" />
</id>
<property name="titulo"
type="string"
not-null="true"
update="false">
<column name="TITULO"/>
</property>
<set name="detalles" lazy="true" inverse="true"
cascade="delete" >
<key>
<column name="formaId" />
</key>
<one-to-many class="encuestas.Detalle"/>
</set>
<set name="Formas_rptas"
lazy="true"
inverse="true"
cascade="delete" >
<key>
<column name="formaID" />
</key>
<one-to-many class="encuestas.FormaRpta"/>
</set>
</class>
</hibernate-mapping>
And, this is FormaRpta
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="encuestas.FormaRpta" table="FORMA_RPTA">
<id name="id" type="long" column="ID">
<!-- <meta attribute="finder-method">findByID</meta> -->
<generator class="native"/>
</id>
<property name="Fecha_rpta"
type="string"
not-null="true"
update="false">
<column name="FECHA_RPTA"/>
</property>
<many-to-one
name="alumno"
class="encuestas.Persona"
>
<!-- Used by code generator
<meta attribute="finder-method">findByAuthorID</meta> -->
<!-- Used as a DDL hint -->
<column name="alumnoID" not-null="true" />
</many-to-one>
<many-to-one
name="forma"
class="encuestas.Forma"
>
<!-- Used by code generator
<meta attribute="finder-method">findByAuthorID</meta> -->
<!-- Used as a DDL hint -->
<column name="formaID" not-null="true" />
</many-to-one>
<many-to-one
name="ramo"
class="encuestas.Ramo"
>
<!-- Used by code generator
<meta attribute="finder-method">findByAuthorID</meta> -->
<!-- Used as a DDL hint -->
<column name="ramoID" not-null="true" />
</many-to-one>
</class>
</hibernate-mapping>
The classes:
public class Ramo implements Serializable{
private Long id;
private String nombre;
private Set alumnos = new HashSet();
private Set Formas_rptas = new HashSet();
public Ramo() {};
public Long getId(){
return id;
}
public void setId(Long id){
this.id = id;
}
public String getNombre(){
return nombre;
}
public void setNombre(String nombre){
this.nombre = nombre;
}
public Set getAlumnos(){
return alumnos;
}
public void setAlumnos(Set alumnos){
this.alumnos = alumnos;
}
public void addAlumno(Alumno alumno) {
if(alumno == null)
throw new IllegalArgumentException("Alumno Nulo!");
alumno.getRamos().add(this);
alumnos.add(alumno);
}
public Set getFormas_rptas(){
return Formas_rptas;
}
public void setFormas_rptas(Set formas_rptas){
this.Formas_rptas = formas_rptas;
}
}
public class Forma implements Serializable{
private Long id;
private String titulo;
private Set detalles = new HashSet();
private Set Formas_rptas = new HashSet();
public Forma() {}
public Long getId(){
return id;
}
public void setId(Long alumno_id){
this.id = alumno_id;
}
public String getTitulo(){
return titulo;
}
public void setTitulo(String titulo_alum){
this.titulo = titulo_alum;
}
public Set getDetalles(){
return detalles;
}
public void setDetalles(Set detalles){
this.detalles = detalles;
}
public void addDetalle(Detalle detalle) {
if(detalle == null)
throw new IllegalArgumentException("detalle Nulo!");
detalle.setUna_forma(this);
detalles.add(detalle);
}
public Set getFormas_rptas(){
return Formas_rptas;
}
public void setFormas_rptas(Set formas_rptas){
this.Formas_rptas = formas_rptas;
}
}
public class Alumno extends Persona
implements Serializable
{
//private long id;
private String password;
private Set Formas_rptas = new HashSet();
private Set ramos = new HashSet();
public Alumno() {super();}
public String getPassword() {
return password;
}
public void setPassword(String pass) {
this.password = pass;
}
public Set getFormas_rptas(){
return Formas_rptas;
}
public void setFormas_rptas(Set formas_rptas){
this.Formas_rptas = formas_rptas;
}
public void addFormas_rptas(FormaRpta forma) {
if(forma == null)
throw new IllegalArgumentException("forma rpta Nula!");
forma.setAlumno(this);
Formas_rptas.add(forma);
}
public Set getRamos(){
return ramos;
}
public void setRamos(Set ramos){
this.ramos = ramos;
}
public void addRamo(Ramo ramo) {
if(ramo == null)
throw new IllegalArgumentException("Ramo Nulo!");
ramo.getAlumnos().add(this);
ramos.add(ramo);
}
}
public class FormaRpta
implements Serializable
{
private Long id;
private String Fecha_rpta;
private Alumno alumno;
private Forma forma;
private Ramo ramo;
public FormaRpta() {}
public Long getId(){
return this.id;
}
public void setId(Long forma_rpta_id){
this.id = forma_rpta_id;
}
public String getFecha_rpta(){
return Fecha_rpta;
}
public void setFecha_rpta(String fecha_rpta){
this.Fecha_rpta = fecha_rpta;
}
public Alumno getAlumno(){
return alumno;
}
public void setAlumno(Alumno alum){
this.alumno = alum;
}
public Forma getForma(){
return forma;
}
public void setForma(Forma forma){
this.forma = forma;
}
public Ramo getRamo(){
return ramo;
}
public void setRamo(Ramo ramo){
this.ramo = ramo;
}
}
Code between sessionFactory.openSession() and session.close():
For example, the next code print fine to Alumno, but not for Ramo and Forma.
Long idAl = new Long(1);
Long idRamo = new Long(1);
Long idForma = new Long(1);
Alumno al = (Alumno) sess.load(Alumno.class, idAl);
Ramo r = (Ramo) sess.load(Ramo.class, idRamo);
Forma f = (Forma) sess.load(Forma.class, idForma);
out.println("\n de ALUMNO");
for (Iterator it = al.getFormas_rptas().iterator(); it.hasNext();) {
FormaRpta frp = (FormaRpta) it.next();
out.println(" FR: "+frp.getId());
}
out.println("\n de RAMO");
for (Iterator it = r.getFormas_rptas().iterator(); it.hasNext();) {
FormaRpta frp = (FormaRpta) it.next();
out.println(" FR: "+frp.getId());
}
out.println("\n de FORMA");
for (Iterator it = f.getFormas_rptas().iterator(); it.hasNext();) {
FormaRpta frp = (FormaRpta) it.next();
out.println(" FR : "+frp.getId());
}
Full stack trace of any exception that occurs:
No errors in compile. Just when I load the page web, print fine to Alumno, but not for classes Ramo and Forma (print nothing), because their getter don't execute nothing.
Name and version of the database you are using:
Mysql 5.0.22-Debian_0ubuntu6.06.2
thanks for read this. Please, help me.
Paola
|