Boa Tarde Pessoal,
Estou com um problema meio incomum, mais busco uma solução, tenho um cenário onde tenho varias bases de banco de dados(postgresql) alocas em vários clientes, todas as bases tem a mesma estrutura mais com registos diferentes, ai tenho uma aplicação em java com jpa, ecliselink, ejb 3, já pronta e funcionamento, hoje nela eu utilizo o EntityManager deixando o container gerenciar as transações para mim (CMT - Container Managed Transaction), então não preciso ficar dando begin e commit ele resolve quando executar da melhor maneira. Bom tento isso em mente, preciso continuar a utilizar essa estrutura, e não posso mudar para o modo manual (BTM - Bean Managed Transaction), preciso continuar utilizando o CMT (por motivos maiores).
Pesquisando e estudando bastante o conceito consegui realizar a funcionalidade de conectar em varias bases mais com JTA, só que dessa maneira não consegui que ela seja gerenciada pelo container(CMT), eu teria que dar o begin e commit. Vou postar o código que consegui realizar essa função, se alguem souber como deixar a transação como CMT seguindo essa base de raciocínio e agradeceria.
Código abaixo funciona, mais não esta executando como CMT, só persiste se ter o begin e commit.
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class TestEntDAO {
private EntityManager em;
private EntityManagerFactory emf;
@PostConstruct
public void init() {
em = getEntityManager();
}
public EntityManager getEntityManager() {
Map props = new HashMap();
props.put(PersistenceUnitProperties.TRANSACTION_TYPE, "JTA");
props.put(PersistenceUnitProperties.JTA_DATASOURCE, dataSourceName()); // <- Aqui será injetado o cliente que está logado, pegando a base dele.
emf = Persistence.createEntityManagerFactory("testePU", props);
em = emf.createEntityManager();
return em;
}
public String dataSourceName(){
if(someCondition){
return "db1";
}else{
return "db2";
}
}
public salvar(Tabela tab){
em.persist(tab);
} //<-- quando termia esse método era para dar o commit automatico (CMT), mais não esta sincronizando as transações.
}
Alguém que entenda bem de JPA poderia me ajudar ?
(Observação: Se alguém falar para usar varios @PersistenceContext(unitName = “db1”), não posso usar dessa maneira, por que se caso algum IP sair fora ou der problema em alguma base a aplicação não sobe, dando uma dor de cabeça, também já tentei utilizar o Multitenancy não se encaixou nesse caso.)