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

OpenSessionInView Filter no Tomcat 7

Bom dia galera,

sou iniciante em Java e gostaria que os senhores tirassem uma duvida. O padrão OpenSessionInView não funciona no tomcat por ser um servlet container, mas posso aplica-lo em um application server como o glassfish?

A razão dessa pergunta é que, eu tentei aplicar este padrão de todas as formas no tomcat mas não funcionou sempre dava o velho lazyinitializationexception, mas quando apliquei no glassfish funcionou perfeitamente.

Segue o filtro:

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

    @Override
    public void destroy() {


    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        //inicia a transação antes de processar o request
        EntityManager entityManager = JPAUtil.getEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        try {
            tx.begin();

            //processa a requisição
            chain.doFilter(request, response);

            //faz o commit
            tx.commit();
        } catch (Exception e) {
            if(tx != null && tx.isActive()){
                tx.rollback();
            }
        }finally{
            entityManager.close();
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {


    }

}

Classe JPAUtil

public class JPAUtil{

    private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("default");

    private JPAUtil(){
    }

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

BeanEstado onde ocorre o lazyinitializationexception

@ManagedBean
public class EstadoFaces {
    private Estado estado = null;
    private EstadoDAO estadoDAO = null;

    public Estado getEstado() {
        if(estado == null){
            EntityManager em = JPAUtil.getEntityManager();
            estado = em.find(Estado.class, 10);
            em.close();

        }
        return estado;
    }

Entity Estado o problema ocorre quando eu tento exibir as cidades do estado selecionado, mas a EntityManager já esta fecha.

 @Entity
@Table(name="tb_estados")
public class Estado implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Integer id;

    @Column(nullable=false)
    private String uf;

    @Column(name="nome", nullable=false)
    private String descricao;

    @OneToMany(fetch=FetchType.LAZY, mappedBy="estado")
    private List<Cidade> cidades;

//getters e setters
}

Já estou com esse problema a vários dias, por favor me alguém pode me ajudar?

  • É pra funcionar o container web do glassfish é o tomcat. Edite a sua pergunta e poste o código do seu web.xml.

    GasparB   12 de jun de 2013
  • Exato, OpenSessionInView tem que funcionar em qualquer servlet container. Até porquê, geralmente ele é apenas um Filter ;)

    WRYEL   12 de jun de 2013
  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 glassfish lazy tomcat ou faça a sua própria pergunta.