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

error con LazyInitializationException.java

Estas en el tema de error con LazyInitializationException.java en el foro de Java en Foros del Web. Hola, arranco mi aplicación y todo va bien, pero cuando quiero visualizar una página web obtengo las siguientes trazas de error, ¿podéis echarme un cable? ...
  #1 (permalink)  
Antiguo 09/09/2009, 04:01
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
error con LazyInitializationException.java

Hola, arranco mi aplicación y todo va bien, pero cuando quiero visualizar una página web obtengo las siguientes trazas de error, ¿podéis echarme un cable? Muchas gracias, y un saludo

2009-09-09 10:54:18,450 ERROR (LazyInitializationException.java :19 ) -
illegal access to loading collection
org.hibernate.LazyInitializationException: illegal access to loading collection
at org.hibernate.collection.AbstractPersistentCollect ion.initialize(Abst
ractPersistentCollection.java:341)
at org.hibernate.collection.AbstractPersistentCollect ion.read(AbstractPe
rsistentCollection.java:86)
at org.hibernate.collection.AbstractPersistentCollect ion.readElementExis
tence(AbstractPersistentCollection.java:142)
at org.hibernate.collection.PersistentSet.add(Persist entSet.java:187)
at es.aena.sgma.controlresiduos.data.entity.Empresa.s etTipoempresa(Empre
sa.java:110)
at es.aena.sgma.controlresiduos.data.entity.EmpresaEn trega.<init>(Empres
aEntrega.java:48)
at java.lang.LangAccessImpl.emptyConstructor(Ljava.la ng.Class;Ljava.lang
.Object;)V(Unknown Source)
at jrockit.reflect.EmptyConstructorInvoker.newInstanc e([Ljava.lang.Objec
t;)Ljava.lang.Object;(Unknown Source)
at java.lang.reflect.Constructor.newInstance([Ljava.lang.Object;I)Ljava.
lang.Object;(Unknown Source)
at org.hibernate.tuple.PojoInstantiator.instantiate(P ojoInstantiator.jav
a:88)
at org.hibernate.tuple.PojoInstantiator.instantiate(P ojoInstantiator.jav
a:100)
at org.hibernate.tuple.entity.AbstractEntityTuplizer. instantiate(Abstrac
tEntityTuplizer.java:351)
at org.hibernate.persister.entity.AbstractEntityPersi ster.instantiate(Ab
stractEntityPersister.java:3606)
at org.hibernate.impl.SessionImpl.instantiate(Session Impl.java:1275)
at org.hibernate.impl.SessionImpl.instantiate(Session Impl.java:1264)
  #2 (permalink)  
Antiguo 09/09/2009, 04:32
 
Fecha de Ingreso: septiembre-2009
Mensajes: 9
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: error con LazyInitializationException.java

puedes detallar un poc mas la situacion? veo que estas con hibernate pero en que causistica se te da el error exactamente?
  #3 (permalink)  
Antiguo 09/09/2009, 04:47
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: error con LazyInitializationException.java

Hola, escribo el código que se supone da error (linea 110 de Empresa.java, donde pone más abajo "tipoempresa.getEmpresas().add(this);"):


package es.aena.sgma.controlresiduos.data.entity;

import javax.persistence.*;

import org.apache.log4j.Logger;

import es.aena.sgcomun.base.data.entity.TraceableEntity;
import es.aena.sgcomun.base.service.StaticServiceLocator;
import es.aena.sgcomun.base.service.impl.SpringStaticWebC onfiguredServiceLocator;
import es.aena.sgma.controlresiduos.data.dao.TipoEmpresaD ao;

@Entity
@Table (name = "D_EMPRESAS")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "D_TIPOS_EMPRESA_NOMBRE")
public class Empresa extends TraceableEntity {

public static final String EMPRESA_GESTION = "GESTION";
public static final String EMPRESA_ENTREGA = "ENTREGA";
public static final String EMPRESA_TRANSPORTE = "TRANSPORTE";

protected static TipoEmpresa TIPO_EMPRESA_GESTION = null;
protected static TipoEmpresa TIPO_EMPRESA_ENTREGA = null;
protected static TipoEmpresa TIPO_EMPRESA_TRANSPORTE = null;

private transient Logger logger = Logger.getLogger(this.getClass());

@Id
@Column (name = "ID")
@GeneratedValue (generator = "SeqDEmpresas")
@SequenceGenerator (name= "SeqDEmpresas", sequenceName ="SEQ_D_EMPRESAS", allocationSize = 1)
private Long id;

@Column (name = "NOMBRE")
private String nombre;

@Column (name = "DESCRIPCION")
private String descripcion;

@Column (name = "CIF")
private String cif;

@ManyToOne (targetEntity = TipoEmpresa.class)
@JoinColumn (name = "D_TIPOS_EMPRESA_NOMBRE", nullable = true)
private TipoEmpresa tipoempresa;

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getDescripcion() {
return descripcion;
}

public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}

public String getCif() {
return cif;
}

public void setCif(String cif) {
this.cif = cif;
}

public Long getId() {
return id;
}

public void setId(Long id){
this.id = id;
}

public Empresa() {
super();
try {
StaticServiceLocator serviceLocator = SpringStaticWebConfiguredServiceLocator.getDefault ServiceLocator();
if (serviceLocator == null) {
this.logger.warn("No hay ServiceLocator disponible, no se pueden inicializar los tipos de empresa");
}
else {
TipoEmpresaDao tipoEmpresaDao = (TipoEmpresaDao) serviceLocator.getBean("tipoEmpresaDao");
TIPO_EMPRESA_GESTION = tipoEmpresaDao.loadByPrimaryKey(EMPRESA_GESTION);
TIPO_EMPRESA_ENTREGA = tipoEmpresaDao.loadByPrimaryKey(EMPRESA_ENTREGA);
TIPO_EMPRESA_TRANSPORTE = tipoEmpresaDao.loadByPrimaryKey(EMPRESA_TRANSPORTE );
}
} catch (Exception e) {
throw new RuntimeException("Error Grave al inicializar entidad \"Empresa\"" + e.getMessage());
}
//this.tipoempresa.setTipo(TIPO_EMPRESA_TRANSPORTE);
//this.tipoempresa = TIPO_EMPRESA_TRANSPORTE;
}

public TipoEmpresa getTipoempresa() {
return tipoempresa;
}

public void setTipoempresa(TipoEmpresa tipoempresa) {
if (this.tipoempresa != null)
{
this.tipoempresa.getEmpresas().remove(this);
}
if (tipoempresa != null)
{
tipoempresa.getEmpresas().add(this);
}
this.tipoempresa = tipoempresa;
}

@Override
public boolean equals(Object obj) {
if (obj instanceof Empresa) {
Empresa objeto = (Empresa) obj;
return (this.id != null) ? this.id.equals(objeto.getId()) : false;
}
else {
return false;
}
}

@Override
public int hashCode() {
if (this.id != null) {
return this.id.hashCode();
}
else {
return 0;
}
}
}

por lo poco que entiendo, no permite hacer ese add. Lo que pretendo es: tengo una entidad (TipoEmpresa.java) que tiene un campo nombre, que puede adoptar varios valores. Tengo otra entidad (Empresa.java) que tira de la anterior, mediante una relación ManyToOne, y la cual, según el valor del campo nombre proveniente de TipoEmpresa, me redireccione a otras entidades diferentes (a saber, EmpresaGestion.java, EmpresaTransporte.java y EmpresaEntrega.java). El código de la entidad TipoEmpresa.java es:

package es.aena.sgma.controlresiduos.data.entity;

import java.util.*;
import javax.persistence.*;

import es.aena.sgcomun.base.data.entity.TraceableEntity;

@Entity
@Table ( name = "D_TIPOS_EMPRESA")
public class TipoEmpresa extends TraceableEntity{

@Id
@Column(name = "NOMBRE", unique = true, nullable = false)
private String nombre;

@Column (name = "DESCRIPCION")
private String descripcion;

@OneToMany(mappedBy = "tipoempresa")
private Set<Empresa> empresas = new HashSet <Empresa>();

public void setEmpresas(Set<Empresa> empresas){
this.empresas = empresas;
}

public Set<Empresa> getEmpresas() {
return empresas;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getDescripcion() {
return descripcion;
}

public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}

public void addEmpresa(Empresa empresa){
if (empresa == null){
throw new IllegalArgumentException("Empresa null");
}
empresa.setTipoempresa(this);
}

public void removeEmpresa(Empresa empresa){
if (empresa == null){
throw new IllegalArgumentException("Empresa null");
}
empresa.setTipoempresa(null);
}

@Override
public boolean equals(Object obj) {
if (obj instanceof TipoEmpresa) {
TipoEmpresa objeto = (TipoEmpresa) obj;
return (this.nombre != null) ? this.nombre.equals(objeto.getNombre()) : false;
}
else {
return false;
}
}

@Override
public int hashCode() {
if (this.nombre != null) {
return this.nombre.hashCode();
}
else {
return 0;
}
}
}

Espero que puedas echarme un cable, y gracias por la rapidez. Un saludo
  #4 (permalink)  
Antiguo 09/09/2009, 05:08
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: error con LazyInitializationException.java

Prueba a poner el atributo lazy="false" en las relaciones. Si no, estás obligado a mantener la conexión abierta mientras trabajas con los objetos obtenidos, cosa que no debe estar pasando.

Última edición por Fuzzylog; 09/09/2009 a las 05:08 Razón: .
  #5 (permalink)  
Antiguo 09/09/2009, 05:11
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: error con LazyInitializationException.java

Mira, mejor te dejo este enlace que he encontrado porque también hablan en los comentarios acerca de la no conveniencia del lazy="false", siendo mejor hacer un PhaseListener.

http://www.javahispano.org/forum/per...__no_session_/
  #6 (permalink)  
Antiguo 09/09/2009, 08:29
 
Fecha de Ingreso: diciembre-2008
Mensajes: 233
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: error con LazyInitializationException.java

Hola, he probado a poner @Proxy (lazy= false) tanto en Empresa.java como en TipoEmpresa.java, para ver si funcionaba con lazy=false, pero da el mismo error.

@Entity
@Table (name = "D_EMPRESAS")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "D_TIPOS_EMPRESA_NOMBRE")
@Proxy (lazy= false)
public class Empresa extends TraceableEntity {
...

Y también, en lugar de eso, poner en el web.xml:

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.O penSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>HBSessionFactory</param-value>
</init-param>
</filter>

pero tampoco funciona, ¿se me pasa algo por alto?. Muchas gracias, un saludo
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 03:45.