Во-первых, я бы не хотел создавать EntityManagerFactory
на лету.Я полагаю, вам придется делать это при каждом создании экземпляра DAO (или любого объекта EJB, который вы используете для доступа к вашей базе данных).Если это так, подумайте дважды: создание EntityManagerFactory
очень дорого и обычно должно выполняться один раз в жизненном цикле приложения.В качестве альтернативы я бы, вероятно, создал разные DAO для каждой единицы персистентности, перенеся ответственность за использование одного или другого на верхний уровень, так что вы все еще можете положиться на контейнер для создания EntityManager
.
При этом в вашем контексте и в предположении, что метод yieldEM () находится в EJB, и вы используете безопасность, управляемую контейнером, вы можете внедрить EJBContext с помощью:
@Resource
EJBContext ejbContext;
Отсюда вы можете получить Principal
и создайте свой EntityManager в зависимости от него.
Если какое-либо из предположений недействительно, дайте мне знать и постараюсь обновить мой ответ.
РЕДАКТИРОВАНИЕ:
@Stateless
public class EntityManagerService {
@Resource
EJBContext ejbContext;
@Produces
public EntityManager produceEM() {
EntityManagerFactory managerFactory = Persistence.createEntityManagerFactory(ejbContext.getCallerPrincipal().getName());
return managerFactory.createEntityManager();
}
}
Вы также можете создать собственное отображение между именами пользователей и именами БД, что, вероятно, является хорошей идеей, если вы хотите разделить их.