[RESOLVIDO] Hibernate + LazyInitializationException

6 respostas
A

Galera, estou com um problema meio estranho aqui....

Quando o usuário loga no sistema, eu jogo ele para a sessão... o problema é que se eu não fecho a conexão do hibernate, ao tentar alterar dados do usuário, apresenta erro, informando que tem duas conexões abertas. Se eu fecho a conexão do hibernate ele não consegue jogar o usuário na sessão.

Para tentar resolver o problema, eu passei a jogar o usuário para sessão, antes de encerrar a conexão de login. O problema estranho é que agora, se eu rodo a aplicação com o debbug e simplesmente vou avançando sem mexer em nada, eu logo normalmente e aplicação funciona, como deveria... Porém, se eu rodar a aplicação direto (sem debbug), ele volta o erro falando que não tem sessão...

Classe de login

public TbUsuario usuarioSenha(String usuario, String senha) throws NoSuchAlgorithmException, IOException {
        session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        /*
         * Verificando se usuario existe na base
         */
        Criteria criterio = session.createCriteria(TbUsuario.class).add(Restrictions.eq("login", usuario)).add(Restrictions.eq("senha", senha));
        TbUsuario usuarioLogado = (TbUsuario) criterio.uniqueResult();
        /*
         * Inválido
         */
        if (usuarioLogado == null) {
            return null;
        } else {
            /*
             * Efetuando chamada dos atributos para evitar perda de dados -
             *
             */
            Hibernate.initialize(usuarioLogado);
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuario", usuarioLogado);
            getSession().setAttribute("usuarioLogado", usuarioLogado);
            FacesContext.getCurrentInstance().getExternalContext().redirect("/maclla/dashboard.jsf");
            session.close();
            return usuarioLogado;
        }

    }

Erro gerado

rave: Error Rendering View[/dashboard.xhtml]
com.sun.faces.mgbean.ManagedBeanCreationException: Não é possível criar instância para·a classe: view.managedBeans.Dashboard.
	at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:193)
	at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:102)
	at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
	at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
	at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
	at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
	at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
	at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
	at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:71)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:147)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
	at javax.faces.component.UIOutput.getValue(UIOutput.java:169)
	at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:424)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
	at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:149)
	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:195)
	at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
	at model.entity.TbPerfil_$$_javassist_12.getNome(TbPerfil_$$_javassist_12.java)
	at view.managedBeans.Dashboard.ativarMenu(Dashboard.java:53)
	at view.managedBeans.Dashboard.<init>(Dashboard.java:122)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
	at java.lang.Class.newInstance0(Class.java:372)
	at java.lang.Class.newInstance(Class.java:325)
	at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:188)
	... 48 more

6 Respostas

M

Olá,
Este problema acontece porque na sua view você esta tentando pegar algum atributo que depende de conexão para carrega-lo, o Hibernate.initialize não carrega todo o seu objeto com os relacionamentos,
isso você terá que fazer na mão!!!

abraço!

A

mmaico:
Olá,
Este problema acontece porque na sua view você esta tentando pegar algum atributo que depende de conexão para carrega-lo, o Hibernate.initialize não carrega todo o seu objeto com os relacionamentos,
isso você terá que fazer na mão!!!

abraço!

Feito na mão amigo. Obrigado pela ajuda.
Mas ainda considero muito estranho o fato de quanto estava “debbugando”, funcionar normal…

M

Pode ser que você especionou o objeto que vc iria usar na sua view, quando isso acontece o hibernate entra em ação e carrega o objeto, acredito que por isso não tenha dado pau.

abraço!

H

Aanderson:
mmaico:
Olá,
Este problema acontece porque na sua view você esta tentando pegar algum atributo que depende de conexão para carrega-lo, o Hibernate.initialize não carrega todo o seu objeto com os relacionamentos,
isso você terá que fazer na mão!!!

abraço!

Feito na mão amigo. Obrigado pela ajuda.
Mas ainda considero muito estranho o fato de quanto estava “debbugando”, funcionar normal…

Ao debugar você poderia estar disparando a ação de visualizar a lista e com isso trazer os valores. [=

A

É, apesar de estranho, tem lógica. Obrigado a ambos, pela ajuda.

H

Aanderson:
É, apesar de estranho, tem lógica. Obrigado a ambos, pela ajuda.
Acho estranho não. Se você acessa a lista ele tem que fazer a pesquisa uai. O.o

Criado 27 de novembro de 2012
Ultima resposta 29 de nov. de 2012
Respostas 6
Participantes 3