Open Session in View ( LazyInitializationException )

3 respostas
T

Alguém consegiu contornar open session in view ao trabalhar com JPA? Poderia compartilhar?

Estou tendo o famoso "LazyInitializationException", e encontrei diversas soluções porém todas ligadas ao hibernate.
Sendo assim eu teria que implementar o "HibernateUtil" para pegar o session, ficando asssim amarrado ao hibernate..
Ou utilizar algum framework como Spring ou Eclipse Link para controlar o opem session in view. me corrijam se estiver errado..

Estou fazendo assim atualmente..

Salvo um objeto.
getEm().merge(paciente);
getEm().flush();
//retorna o EntityManager
public EntityManager getEm() {
		ELContext el = FacesContext.getCurrentInstance().getELContext();

		return (EntityManager) FacesContext.getCurrentInstance()
				.getApplication().getELResolver()
				.getValue(el, null, "entityManager");

	}
//Web Filter JPA
public class FiltroJPA implements Filter {

	private EntityManagerFactory factory;

	@Override
	public void destroy() {
		this.factory.close();
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
	throws IOException, ServletException,PersistenceException
	{
		EntityManager entityManager = this.factory.createEntityManager();
		request.setAttribute("entityManager", entityManager);
		
		entityManager.getTransaction().begin();
		chain.doFilter(request, response);
		 
		try {
			entityManager.getTransaction().commit();
		} catch (Exception e) {
			entityManager.getTransaction().rollback();
		} finally {
			entityManager.close();
		}
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		this.factory = Persistence.createEntityManagerFactory("jpa");
	}

Aceito sugestões :D

3 Respostas

Flavio_Almeida

Se você não precisa de conversação e está recebendo esta exceção, bem, isso é um forte indício de que você não planejou suas consultas. Você pode até utilizar o anti-pattern OpenSessionInView para não ter mais este erro, mas você terá, muito provavelmente, consultas N+1.

Tenho um post sobre esse assunto, se você quiser se aprofundar mais.

http://www.guj.com.br/java/231652-alguem-usa-algum-padrao-diferente-de-open-session-in-view-ao-trabalhar-com-jpa

T

Flavio Almeida:
Se você não precisa de conversação e está recebendo esta exceção, bem, isso é um forte indício de que você não planejou suas consultas. Você pode até utilizar o anti-pattern OpenSessionInView para não ter mais este erro, mas você terá, muito provavelmente, consultas N+1.

Tenho um post sobre esse assunto, se você quiser se aprofundar mais.

http://www.guj.com.br/java/231652-alguem-usa-algum-padrao-diferente-de-open-session-in-view-ao-trabalhar-com-jpa

Opa flávio. Estou no início do projeto, ainda da tempo de mudar as consultas.

Você se refere ao Fetch.Lazy por ex?

vinicius8891


Flavio Almeida wrote:Se você não precisa de conversação e está recebendo esta exceção, bem, isso é um forte indício de que você não planejou suas consultas. Você pode até utilizar o anti-pattern OpenSessionInView para não ter mais este erro, mas você terá, muito provavelmente, consultas N+1.

Tenho um post sobre esse assunto, se você quiser se aprofundar mais.

http://www.guj.com.br/java/231652-alguem-usa-algum...n-in-view-ao-trabalhar-com-jpa

Opa flávio. Estou no início do projeto, ainda da tempo de mudar as consultas.

isso é um forte indício de que você não planejou suas consultas.

Você se refere ao Fetch.Lazy por ex?

Bom o tópico não é muito recente, mas estou passando pelo mesmo problema, alguém mais também teve esse problema, e como solucionou?
E qual solução adotaram?

Obrigado desde já pessoal.

Criado 18 de agosto de 2011
Ultima resposta 15 de ago. de 2012
Respostas 3
Participantes 3