Estou precisando de uma ajuda… Já procurrei pesquisei muito, mas não encontrei especificamente o que estou precisando. Minha dúvida é:
Estou trabalhando em uma aplicação Web com JPA + Hibernate, e preciso que essa aplicação possa se conectar a bases de dados diferentes, de acordo com o ususário que a acessa.
Ex.:
Usuário Ricardo -> Base Empresa 1
Usuário Jonas -> Base Empresa 2
Usuário José -> Base Empresa 54
Estou usando uma unidade de persistência JTA que usa um pool de conexão do container. Acho que preciso usar o @Produces, para produzir minha unidade de persistência, mas não achei uma maneira de criar a unidade personalizada para cada conexão, cada uma com seu jta-data-source.
Esse código funciona perfeitamente:
@Dependent
public class ApplicationConfig implements Serializable {
@Produces
@PersistenceUnit(unitName = "UnidadePersistenciaPU")
@EntityManagerConfig
public EntityManagerFactory emf;
@Produces
@EntityManagerConfig
public EntityManager getEntityManager() {
return emf.createEntityManager();
}
}
Mas o problema é que a unidade de persistência “UnidadePersistenciaPU” tem um jta-data-source fixo no arquivo, e não sei em qual momento eu poderia mudar esse valor. Eu poderia criar um arquivo xml para cada cliente, e depois uma atributo EntityManagerFactory para cada cliente, mas também precisaria recompilar a aplicação a cada novo cliente cadastrado.
Também tentei deixar o metodo que produz dessa maneira:
Opa, tudo certo. Na verdade não como eu queria. Até dei um tempo nesse assunto, mas ainda procuro a solução que quero. Encontrei essa solução, que se encaixaria no problema:
Como eu uso CDI para injeção do EntityManager nos beans, tive que customizar o metodo produtor da injeção, por isso o @Produces. E sim, uso um stateful bean, caso contrario tenho problemas com lazy load. Vou acompanhar o novo tópico sim, vlw!