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:
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?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
les dejo el script de la BD:
Código:
el codigo de las clases: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) )
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:
y finalmente los mapeospublic 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)); } }
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:
desde ya gracias por la ayuda<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>
PD: trato de mantener la propiedad lazy de la relacion