Carregamento LAZY (Exception)
Galera estou tendo problemas usando JPA e JSP.
Todos os relacionamentos no JPA entre as entidades
eu coloquei do tipo LAZY. Só que no Servlet quando
eu vou chamar algum atributo de determinada entidade,
da o problema de carregamento do LAZY. Diz que a sessão
não está aberta.
Eu vi algumas pessoas resolvendo esse problema, mas
geralmente o pessoal usa VRaptor, Struts. Eu não estou
usando essas tecnologias.
Gostaria de saber como faz para resolver esse problema
utilizando JPA e JSP.
Todos os relacionamentos no JPA entre as entidades
eu coloquei do tipo LAZY. Só que no Servlet quando
eu vou chamar algum atributo de determinada entidade,
da o problema de carregamento do LAZY. Diz que a sessão
não está aberta.
Eu vi algumas pessoas resolvendo esse problema, mas
geralmente o pessoal usa VRaptor, Struts. Eu não estou
usando essas tecnologias.
Gostaria de saber como faz para resolver esse problema
utilizando JPA e JSP.
Felipe Ramalho
Curtidas 0
Respostas
Guilherme Pizzaia
25/04/2012
Você não poderá acessar os atributos com LAZY, pois eles não são carregados. Sugiro a você realizar uma consulta para carregar os atributos que quiser.
GOSTEI 0
Davi Costa
25/04/2012
Extao faz como o Guilherme sugeriu, teoricamente a performance é a mesma pois teria que no banco mesmo pegar os objetos LAZY
att Davi
att Davi
GOSTEI 0
Felipe Ramalho
25/04/2012
É que eu tinha visto na internet o padrão OpenSessionInView, mas não consegui fazer.
Tou vendo que a solução será essa mesmo.
Obrigado pessoal.
Tou vendo que a solução será essa mesmo.
Obrigado pessoal.
GOSTEI 0
Lucas Abatepaulo
25/04/2012
Este padrão que você sitou, basicamente, você deverá criar um filtro web para que o mesmo a cada requisição abra uma sessão com o banco e ao terminar de renderizar a pagina está sessão seja fechada.
segue um EXEMPLO:
segue um EXEMPLO:
public class HibernateSessionFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
HibernateUtil.getSession().beginTransaction();
// continue request processing
chain.doFilter(request, response);
// Commit and cleanup
HibernateUtil.getSession().getTransaction().commit();
} catch (Throwable ex) {
// Rollback
try {
if (HibernateUtil.getSession().getTransaction().isActive()) {
HibernateUtil.getSession().getTransaction().rollback();
}
} catch (Throwable rbEx) {
rbEx.printStackTrace();
}
throw new ServletException(ex);
} finally {
HibernateUtil.closeSession();
}
}
GOSTEI 0
Lucas Abatepaulo
25/04/2012
Mesmo tal padrão pode acarretar em alguns problemas de lazy. Por exemplo, se você buscar um objeto no banco em um primeiro request, e tentar acessar um atributo lazy no segundo request, você terá o problema de lazy. Uma sugestão nesse caso é você buscar novamente o objeto do primeiro request no banco.
GOSTEI 0
Diogo Souza
25/04/2012
O padrão Open Session in View resolve (ou deveria) o problema de lazy mantendo a sessão aberta até que os objetos de preenchimento de uma listagem, por exemplo, sejam exibidos por completos na tela, aí sim o filter fecha a sessão...
Qualquer novo uso do objeto após isso deve requerer uma nova busca à base! :)
Qualquer novo uso do objeto após isso deve requerer uma nova busca à base! :)
GOSTEI 0