Depois que realizo alguma query e vou redirecionar para a página, recebo um erro:
SEVERE: Servlet.service() for servlet action threw exception
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
at br.com.sgdi.bean.sala.SalaBean$$EnhancerByCGLIB$$971232f.getSalaUnidadeID(<generated>)
at br.com.sgdi.sessao.SessionValidate.SessionValidate.UnidadeDados(SessionValidate.java:110)
at br.com.sgdi.struts.action.principal.PrincipalAction.execute(PrincipalAction.java:35)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Isto acontece quando você tenta acessar alguma propriedade do teu objeto gerenciado pelo Hibernate depois de ter fechado a Session. Um exemplo típico seria o seguinte:
Imagine que você tem um Usuario que tem relacionamento 1:1 com Endereco (isto significa que na classe Usuario haverá um atributo endereco). Você então quer ler esse usuário da base e mostrar o nome e o endereço dele na tua página. Tipicamente, você abre uma session do Hibernate e faz a seguinte query para obter o usuário:
FROM Usuario u WHERE u.id = 'algum_id'
Depois disso você fecha a session e coloca à disposição da tua página o objeto retornado. Na tua página, quando você acessar usuario.endereco.rua (supondo que o endereço tem um atributo rua), uma LazyInitializationException será lançada. Isto ocorre porque as queries normalmente não retornam os dados dos relacionamentos do objeto (se você não especificar nada para o Hibernate, ele assume que o teu relacionamento é lazy). Isto significa que os dados do endereço só seriam realmente lidos da base se você chamasse usuario.getEndereco().getRua(), por exemplo, com a session do Hibernate aberta.
O que você pode fazer pra contornar isso é dizer para o Hibernate carregar automaticamente o relacionamento endereço. Você pode fazer isso na query dessa forma:
FROM Usuario u LEFT JOIN FETCH u.endereco WHERE u.id = 'algum_id'
Você também pode fazer isso no arquivo .hbm.xml da classe Usuario, informando o atributo lazy=“false” para o relacionamento com o Endereço. Outra opção é, depois que o objeto Usuario for carregado - e antes de fechar a session - você pode chamar o método Hibernate.initialize(usuario.getEndereco()). Esta chamada força a inicialização da coleção, lendo os dados da base.
Caso você opte por uma das duas primeiras que eu expliquei acima, tome muito cuidado. O lazy initialization do Hibernate existe para evitar que o carregamento de uma entidade provoque selects em cascata no banco de dados, o que poderia levar à degradação da performance da tua aplicação. Recomendo que você leia a documentação do Hibernate que explica com mais detalhes essa parte de inicialização de relacionamentos.
você está acessando dados que não foram carregados pela Session.
Por exemplo, você tem alguma lista de alguma coisa, e nessa lista cada registro é de um objeto que tem um atributo que seja uma outra classe:
ex: uma Compra pode ter vários produtos.
Então você faz uma query:
from Compra;
e retorna todas as compras, fecha a Session e manda pro jsp.
Se no jsp você tentar acessar o atributo produtos de uma compra, se ela não foi mapeada como EAGER vai dar esse erro, porque não foi carregada na Session os produtos, somente as compras.
O jeito de fazer isso é usar um filter OpenSessionInView, em que a Session só é fechada depois que os dados são mostrados, e a outra solução é inicializar os atributos que você vai precisar antes de fechar a Session.
Não entendi amigos…entendi na teoria, mas na pratica não hehe … Antes eu abria um sessionFactory sempre e depois ia fechando ela e as sessions, mas li em outro tópico que isso não iria aproveitar o pool, então criei a classe singleton com o SessionFactory que seria a responsável para gerenciar isso, então começaram meus problemas…ahaha
Neste link http://www.guj.com.br/posts/list/83768.java tem o meu método de login que retorna um array com o usuário e então eu passo esse array para o HttpSession para que eu possa exibir o nome do usuário logado. O que eu deveria fazer para que funcione?
vi teu outro tópico vi também que você não está usando anotações no código.
Acho que isso complica porque você tem que escrever um novo arquivo xml para cada entidade mapeada,e também com o xml você tem que escrever muito mais que a anotação e acho pouco intuitivo.
daí do seu servlet você chama esse método e vê se não retornou null, então você joga o objeto pra sessão. se retornou null, então é porque não existe o usuario cadastrado.
daí do seu servlet você chama esse método e vê se não retornou null, então você joga o objeto pra sessão. se retornou null, então é porque não existe o usuario cadastrado.[/quote]
Isso eu já tenho feito, eu chamo?
Queries queries = new Queries(br.com.sgdi.bean.profissional.ProfissionalBean.class);
List usuario = new ArrayList();
usuario = queries.verificarLoginUsuario(formulario.getLogin()
.getUsuario(), senha);
UnidadeBean unidadeBean = null;
if (usuario.size() > 0) {
HttpSession session = request.getSession();
session.setAttribute("usuario", usuario);
return map.findForward("sucesso");
}
Na primeira vez que eu logo, ele passa pelo login, ai na segunda quando vai rodar outra query, ele me da esse erro
Eu efeuto o login, sou redirecionado para uma action que me manda para uma nova classe e este erro acima, ocorre quando eu rodo o método que preenche uma nova lista, só que continua com o mesmo erro anterior. Meu filter está igualzinho o do site do hibernate e o mapeamento dele também.
Aparentemente resolvido o problema, o erro persistia pq tinha alguns métodos que fechavam a conexão. Agora tenho uma dúvida: qm fecha minha conexão e onde?