1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

OpenSessionAnTransactionInView: Como funciona?

Estou estudando o framework jsf e o hibernate por um livro da casa do codigo, e cheguei à uma parte muito interessante, onde é criado um filtro para impedir o LazyInicializationException.

Esse filtro faz com que a EntityManager seja aberta e fechada na hora correta. Até aí tudo bem.

O problema é que não sei como utilizar a EntityManager na minha DAO agora.

Imagine o filtro seguinte:

@WebFilter(urlPatterns="/*") 
public class OpenSessionAndTransactionInView implements Filter {

    @Override
    public void destroy() {
        JPAUtil.closeEntityManagerFactory();
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
        EntityManager em = JPAUtil.getEntityManager(); 
        EntityTransaction tx = em.getTransaction(); 
        try { 
            tx.begin();
            chain.doFilter(request, response);
            tx.commit(); 
        } catch (Exception e){
            if(tx != null && tx.isActive()){ 
                tx.rollback(); 
            } 
        } finally { 
            em.close(); 
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

E agora temos a classe AtividadeDAO, que é onde será feita a persistência dos dados:

public class AtividadeDAO{
    EntityManager em;

    public AtividadeDAO(){
        em = JPAUtil.getEntityManager();
    }

    public void salva(Atividade a){
        em.persist(a);
    }
}

E a JPAUtil, que me fornece uma instancia da EntityManager:

public class JPAUtil {
    private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("default");

    public static EntityManager getEntityManager() { 
        return emf.createEntityManager(); 
    }

    public static void closeEntityManagerFactory(){
        emf.close();
    }

}

A minha duvida nessa história é: O meu filtro, teoricamente está beleza, mas nao me parece que na minha DAO eu faço uso dele, me parece que eu simplesmente ignoro sua existencia e crio mais uma instância da EntityManager.

Estou certo?

Como proceder diante da situação?

  • Alguem que possa ajudar? Estou pensando seriamente em deixar de utilizar o carregamento lazy, pois não consigo entender como esse filtro funciona.

    renangd   09 de nov de 2014
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jsf hibernate jpa ou faça a sua própria pergunta.