Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/07/2010, 16:44
Avatar de alguienmas
alguienmas
 
Fecha de Ingreso: mayo-2009
Mensajes: 62
Antigüedad: 14 años, 11 meses
Puntos: 8
Hibernate-Lazy-Collection (List)

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