Problema Hibernate - Solucionado!

Java

09/04/2009

Bom dia, Tenho um objeto (Funcionario) que possui vários atributos, entre eles um outro objeto (Cargo). Na minha jsp, tenho uma lista de objetos do tipo Funcionario, e o meu problema é na hora de acessar o atributo "descricao" do objeto-atributo Cargo. Coloquei da seguinte maneira:
<%int cont=1;%>
<c:forEach var="funcionario" items="$">                                             
     <tr>
          <td>${funcionario.matricula}</td>		
          <td>${funcionario.nome}</td>		
          <td>${funcionario.cargo.descricao}</td>                                                                                           
    </tr>
    <%cont++;%>
</c:forEach>
Quando a jsp é chamada , recebo a seguinte mensagem de erro:
javax.el.ELException: Error reading 'descricao' on type model.dto.Cargo$$EnhancerByCGLIB$$8838f8e8
	javax.el.BeanELResolver.getValue(BeanELResolver.java:66)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
	org.apache.el.parser.AstValue.getValue(AstValue.java:97)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:923)
	org.apache.jsp.adm.listaFuncionario_jsp._jspService(listaFuncionario_jsp.java:199)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
	org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

root cause

org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
	org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:60)
	org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
	org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:140)
	model.dto.Cargo$$EnhancerByCGLIB$$8838f8e8.getDescricao(<generated>)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
	org.apache.el.parser.AstValue.getValue(AstValue.java:97)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:923)
	org.apache.jsp.adm.listaFuncionario_jsp._jspService(listaFuncionario_jsp.java:199)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
	org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

Alguém tem alguma sugestão???
Giovane Nunis

Giovane Nunis

Curtidas 0

Respostas

Marcelo Guimarães

Marcelo Guimarães

09/04/2009

org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
Você deve estar usando lazy no cargo e fechou a sessão, assim não tem como você recuperar os dados. O erro aconteceu porque o objeto cargo não foi inicializado para que a descrição possa ser retornada.
GOSTEI 0
Giovane Nunis

Giovane Nunis

09/04/2009

[quote="Ataxexe"]
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
Você deve estar usando lazy no cargo e fechou a sessão, assim não tem como você recuperar os dados. O erro aconteceu porque o objeto cargo não foi inicializado para que a descrição possa ser retornada.
Verifiquei que o problema é qndo eu fecho a sessão. Veja um exemplo q eu utilizo para fechá-la:
//Buscar todos os funcionarios
    public List findAll() throws Exception {
        log.debug("finding all Funcionario instances");
        try {
            String queryString = "from Funcionario";
            Query queryObject = getSession().createQuery(queryString);
            return queryObject.list();
        } catch (RuntimeException re) {
            log.error("find all failed", re);
            throw new Exception("Código Erro: FuncionarioDAO -06\n");
            
        }finally{
            getSession().close();
        }
    }
Comentei a linha " getSession().close();" e funcionou direitinho. Mas agora surgiu outra dúvida: Onde devo fechar a sessão? OBS: Agradeço pela ajuda, pois estou iniciando em Java.
GOSTEI 0
Anderson Wagner

Anderson Wagner

09/04/2009

descomente a linha, é ali mesmo que você tem que fechar a conexão. faça um loop na lista fazendo um
Hibernate.initialize(funcionario.getCargo());
assim você carrega os dados necessários antes de fechar a conexão
GOSTEI 0
Giovane Nunis

Giovane Nunis

09/04/2009

[quote="anderson.wagner"]descomente a linha, é ali mesmo que você tem que fechar a conexão. faça um loop na lista fazendo um
Hibernate.initialize(funcionario.getCargo());
assim você carrega os dados necessários antes de fechar a conexão
Linha descomentada e loop implementado. [b]Problema solucionado![/b] Anderson, muito obrigada pela dica!
GOSTEI 0
POSTAR