Foros del Web » Programación para mayores de 30 ;) » Java »

Hibernate-Lazy-Collection (List)

Estas en el tema de Hibernate-Lazy-Collection (List) en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 06/07/2010, 16:44
Avatar de 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
  #2 (permalink)  
Antiguo 06/07/2010, 19:36
Avatar de FiruzzZ  
Fecha de Ingreso: diciembre-2007
Ubicación: en casa
Mensajes: 470
Antigüedad: 16 años, 4 meses
Puntos: 41
Respuesta: Hibernate-Lazy-Collection (List)

la exception te tira porque estás intentando acceder (recuperar) una collection QUE ESTÁ declarada por el mapeo como LAZY (es decir que no es traida junto con el objeto propietario de la List) FUERA DE LA SESSION con la que FUE recuperado ESE Trabajador, si a getCargoOcupado() lo llamaras dentro del "estado de transacción/session" (realmente no me acuerdo como se decía).. no vas a tener ese problema.
También podés cambiar a lazy="false", así CADA VEZ que recuperas un Trabajador, este va cargar también su respectiva List<Cargo> cargoOcupado si la tuviera..

PD: por lo que veo tu mappeo está bien.. es cuestion de recompilar, asi refresca el mapeo
pero por ahí te faltó --> fetch="join|select|subselect"

Etiquetas: hibernate, lazy
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:06.