Fechando Session e/ou EntityManager

Olá pessoal.

Uma dúvida. No meu projeto utilizo jpa, por isso trabalho com EntityManager. Mas algumas vezes preciso usar Criteria, então retiro a Session usando o método getDelegate() da EntityManager.

No final da minha chamada da Action (estou usando Struts), preciso fechar minha sessão pois utilizo uma só para todas as consultas. Percebi que se fecho a EntityManager, a Session extraída continua aberta e ativa. Se fecho a Session, a EntityManager é fechada, porém se usar o método isOpen() me retorna true, mas se tento utilizá-la em alguma query, o sistema me alerta dizendo que a EntityManager está fechada. Acredito que seja um bug do framework, que só considera isOpen() = false se o método close() for usado direto na EntityManager e não na Session extraída.

Usei o Hibernate Statistics pra ver quantas sessões foram abertas e fechadas e percebi que todas são fechadas se utilizo o close() direto na Session. Se uso close() na EntityManager algumas sessões ficam abertas, pois como já disse, em alguns momentos utilizo o getDelegate().

Estou certa mesmo ou viajei total?

Bom, neste caso, sugiro que, para todo método que utiliza Criteria, você faça feche a session e o entityManager…

Você está utilizando Criteria do JPA ou do Hibernate?

Se for do hibernate, você realmente terá que fechar o session.

jakefrog, estou usando Criteria do Hibernate mesmo.

drsmachado, não posso fechar as duas ao mesmo tempo, pois ao fechar a Session, parece que a EntityManager é fechada tb, pois se eu usar o close() ou tentar utilizá-la é gerada uma exception informando que a sessão já foi fechada.

Só estou com a pulga atrás da orelha porque percebi que apesar da EntityManager ser fechada quando dou um close() na Session, e isso ser confirmado pelo Hibernate Statistics, o método isOpen() retorna true. Estou acreditando que isso é um bug mesmo. O método isOpen() só retorna false se eu der um close() direto na EntityManager , mas nesse caso a Session fica aberta.

Só gostaria de ter certeza que ao fechar a Session, a EntityManager é fechada tb.

Pois eh, uma vez que você chama o Criteria do Hibernate, é ele quem controla a sessão. Não adianta fechar pelo EntityManager.

Eu acho muito arriscado você ter dois controles de transação na sua aplicação, uma pelo JPA (EntityManager) e outra pelo Hibernate.

Realmente, você terá que sempre fechar as duas de modo diferente.

Entendido, obrigada a todos!