Application-managed entity manager em aplicações JEE - Help!

0 respostas
Luiz_Gustavo

Bom dia galera!!

Estou cehgando com algumas dúvidas.

Ao usar application-managed entity manager temos que explicitamente cuidar para que tanto o EntityManager quanto a EntityManagerFactory sejam devidamente fechados.

Usar esta estratégia em aplicações JEE, usando ainda (RESOURCE_LOCAL) é uma estratégia problemática, e o melhor seria utilizar as facilidades oferecidas pela especificação, como injeção de dependência, propagação automática de transações e de contextos de persistência.

E quando usar esta estratégia é uma necessidade?

Preciso usar esta estratégia pois tenho que, em tempo de execução, passar novos parâmetros para a criação de EntityManagers, e creio que injeção de recursos não pode me ajudar nesse caso.

Propagação de contexto de persistência e transações

Propagar o contexto de persistência e transações iniciadas em um EJB Stateful para outros EJBs Stateless que precisam participar de um fluxo de atividade só está sendo possível com a passagem do EntityManager como parâmetro aos métodos desses EJB Stateless (feio isso).

Controlar o ciclo de vida de objetos EntityManager e EntityManagerFactory em EJBs Stateful.

Idealmente gostaria de abrir somente um EntityManager por EJB Stateful, e passar o mesmo a quaisquer outros EJB Stateless que precisem processar operações cuja transação é iniciada e terminada no Stateful (vejam nesse caso o EJB Stateful como um gerenciador de fluxo de atividades, que coordena o uso dos outros EJBs Stateless). Preciso fazer isso por conta do que foi explicado acima, e a intenção de abrir somente um é por questão de desempenho (imagine abrir um EM a cada chamada de método).
Pois bem, preciso me certificar de que estes objetos serão fechados quando o EJB Stateful não for mais necessário, e antes que o mesmo seja passado para o estado Does Not Exist. Poderia fechar estes recursos em um método anotado com @preDestroy, mas o problema é que métodos anotados com @preDestroy não tem a garantia de serem chamados pelo container, e em caso de exceções de sistema nenhum método anotado com @preDestroy é chamado.

É isso galera, resolvi compartilhar as dúvidas pois pode ser que outras pessoas tenham os mesmos problemas, e quem sabe colher algumas sugestões.

Agradeço a quem puder ajudar!!!

Criado 14 de dezembro de 2007
Respostas 0
Participantes 1