Saludos a todos, espero alguien me pueda ayudar.
Al grano.... tengo dos tablas con una relacion m-n, estas mapeadas para Hibernate y he probado con JUNIT que guarde en la BD. Hasta ahi todo bien y sin problemas, pero ahora quiero recuperar un objeto y lo hace.... pero cuando quiero acceder a la lista de objetos de la segunda tabla ( getCargoOcupado() lo pueden ver en el codigo ) me arroja la sgte. Exception:
Código:
06-07-2010 06:19:48 PM org.hibernate.LazyInitializationException <init>
GRAVE: failed to lazily initialize a collection of role: ClasesBases.Trabajador.cargoOcupado, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ClasesBases.Trabajador.cargoOcupado, no session or session was closed
supongo que es producto de que esta tratando de recuperar informacion de la BD y se encuentra cerrada la conexion a esta..... bueno si es asi esto entonces como debo recuperar la lista?
les dejo el script de la BD:
Código:
CREATE TABLE Personal (
codigo INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
rut VARCHAR(15) NOT NULL,
nombre VARCHAR(60) NULL,
cargo VARCHAR(30) NULL,
PRIMARY KEY(codigo)
)
CREATE TABLE Cargos_has_Personal (
Cargos_codigo INTEGER UNSIGNED NOT NULL,
Personal_codigo INTEGER UNSIGNED NOT NULL,
orden INTEGER UNSIGNED NULL,
PRIMARY KEY(Cargos_codigo, Personal_codigo),
INDEX Cargos_has_Personal_FKIndex1(Cargos_codigo),
INDEX Cargos_has_Personal_FKIndex2(Personal_codigo)
)
CREATE TABLE Cargos (
codigo INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nombre VARCHAR(20) NULL,
esFaena BOOL NULL,
PRIMARY KEY(codigo)
)
el codigo de las clases:
Código:
public class Trabajador extends ConexionHibernate implements Serializable{
// PROPIEDADES
private int codigo;
private String nombre;
private String rut;
private String cargo;
private List<Cargo> cargoOcupado = new LinkedList<Cargo>();
private List<MovPersonal> historial = new ArrayList<MovPersonal>();
// CONSTRUCTORES
public Trabajador() { }
public Trabajador(String nombre, String rut, String cargo)
{
this.nombre = nombre;
this.rut = rut;
this.cargo = cargo;
}
// METODOS
// SETTER Y GETTER
public int getCodigo() { return codigo; }
private void setCodigo(int codigo) { this.codigo = codigo; }
public String getCargo() { return cargo; }
public void setCargo(String cargo) { this.cargo = cargo; }
public List<MovPersonal> getHistorial() { return historial; }
public void setHistorial(List<MovPersonal> historial) { this.historial = historial; }
//no lo he probado pero debe dar el mismo problema
public String getNombre() { return nombre; }
public void setNombre(String nombre) { this.nombre = nombre; }
public String getRut() { return rut; }
public void setRut(String rut) { this.rut = rut; }
public List<Cargo> getCargoOcupado() { return cargoOcupado; }
// este es el problema
public void setCargoOcupado(List<Cargo> cargoOcupado) { this.cargoOcupado = cargoOcupado; }
// MANIPULACION HIBERNATE
public int save() { return super.save(this); }
public boolean update() { return update(this); }
public boolean delete() { return super.delete(this); }
public Trabajador getEmpleado(int id) { return (Trabajador)super.getElemento(id)); }
public void addCargo(Cargo c) { this.cargoOcupado.add(c); }
public void addMovimiento(MovPersonal mp) { this.historial.add(mp); }
}
Código:
public class Cargo extends ConexionHibernate implements Serializable{
private int codigo;
private String nombre;
private boolean faena;
public Cargo() { }
public Cargo(String nombre, boolean faena) {
this.nombre = nombre;
this.faena = faena;
}
public int getCodigo() { return codigo; }
private void setCodigo(int codigo) { this.codigo = codigo; }
public boolean isFaena() { return faena; }
public void setFaena(boolean faena) { this.faena = faena; }
public String getNombre() { return nombre; }
public void setNombre(String nombre) { this.nombre = nombre; }
public int save() { return super.save(this); }
public boolean update() { return super.update(this); }
public boolean delete() { return super.delete(this); }
public Cargo getCargo(int id) { return ((Cargo)super.getElemento(id)); }
}
y finalmente los mapeos
Código:
<?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="ClasesBases.Trabajador" table="personal">
<id column="codigo" name="codigo">
<generator class="increment"/>
</id>
<property column="nombre" name="nombre" type="string"/>
<property column="rut" name="rut" type="string"/>
<property column="cargo" name="cargo" type="string"/>
<list cascade="save-update" name="cargoOcupado" table="cargos_has_personal">
<key column="Personal_codigo"/>
<index column="orden"/>
<many-to-many class="ClasesBases.Cargo" lazy="false" column="Cargos_codigo"/>
</list>
<list cascade="save-update" name="historial" >
<key column="Personal_codigo"/>
<list-index column="orden_empleado"/>
<one-to-many class="ClasesBases.MovPersonal"/>
</list>
</class>
</hibernate-mapping>
Código:
<hibernate-mapping>
<class name="ClasesBases.Cargo" table="cargos">
<id column="codigo" name="codigo">
<generator class="increment"/>
</id>
<property column="nombre" name="nombre" type="string"/>
<property column="esFaena" name="faena" type="boolean"/>
</class>
</hibernate-mapping>
desde ya gracias por la ayuda
PD: trato de mantener la propiedad lazy de la relacion