Fórum Carregamento LAZY (Exception) #415836

25/04/2012

0

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

Responder

Posts

25/04/2012

Guilherme Pizzaia

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.
Responder

Gostei + 0

01/05/2012

Davi Costa

Extao faz como o Guilherme sugeriu, teoricamente a performance é a mesma pois teria que no banco mesmo pegar os objetos LAZY

att Davi
Responder

Gostei + 0

01/05/2012

Felipe Ramalho

É 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.
Responder

Gostei + 0

09/05/2012

Lucas Abatepaulo

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();
		}

	}
Responder

Gostei + 0

09/05/2012

Lucas Abatepaulo

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.
Responder

Gostei + 0

13/05/2012

Diogo Souza

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! :)
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar