Opa Keller, beleza?
Essa sessão a que você se refere sera a HttpSession?
Então, é que faz pouco tempo que estou trabalhando com EJBs e ainda não conheço todas as possibilidades.
Vou explicar a minha necessidade, e talvez você possa sugerir uma alternativa.
Cada usuário do sistema possui um usuário paralelo no banco de dados, e as operações de banco de cada usuário do sistema precisam ser feitas com seu usuário correspondente no banco de dados, pois as permissões são controladas no banco, através de triggers (trata-se de um sistema que já existia, e que está sendo refeito).
Essa regra não pode ser mudada, então a alternativa foi trocar, em tempo de execução, os dados da conexão. Faço isso passando um Map na construção do EntityManager.
Esses EntityManagers são criados em Beans Stateful, uma única vez.
Esses Beans Stateful cordenam o fluxo de tarefas, chamando outros Beans Stateless que executam as operações no banco. Para isso, os Beans Stateful iniciam as transações nos EntityManager que possuem, e passam para quaisquer Beans Stateless que seja necessário, para que executem as operações, e depois a transação é finalizada no Bean Stateful.
Precisei fazer toda essa gambiarra pois pegando os EntityManager através da EntityManagerFactory, perco a propagação de transação e de contexto de persistência.
Bom, diante desse cenário, a minha necessidade é garantir que a informação de qual usuário está logado esteja acessível aos Beans Stateful.
Ao fazer o login, eu obtenho um Entity referente ao usuário e guardo na HttpSession, pois assim ele está acessível aos Managed Beans.
O problema é fazer com que esse Entity chegue aos Beans Stateful.
Sei que a HttpSession está acessível a quaisquer Managed Beans, mas não conheço uma sessão equivalente que seja acessível tanto para os ManagedBeans quanto para os EJBs.
Não sei se é possível colocar isso no EJBContext, por exemplo.
O que estou fazendo atualmente, é criar um método em cada EJB Stateful, que recebe esse Entity e configura a EntityManager com as informações do usuário. O problema é que tenho que garantir que esse método seja chamado antes de qualquer outro. Essa abordagem não é nada flexível, pois se eu pudesse colocar a informação do usuário logado em uma área comum a todos os objetos, faria a inicialização do EntityManager num método @PostContruct do EJB, sem chamadas de configuração a partir do Managed Bean.
Putz, escrevi pra caramba, foi mal… mas é melhor explicar o contexto…
O que me sugere?
Obrigado pela atenção.