Carregamento LAZY (Exception)

Java

25/04/2012

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.
Felipe Ramalho

Felipe Ramalho

Curtidas 0

Respostas

Guilherme Pizzaia

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

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
GOSTEI 0
Felipe Ramalho

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.
GOSTEI 0
Lucas Abatepaulo

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:

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

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

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! :)
GOSTEI 0
POSTAR