Múltiplos entityManager na mesma aplicação

2 respostas
java
L

Galera,

estou com um problema pra desenvolver uma aplicação que usa múltiplos bancos de dados. Na minha aplicação web, preciso que cada usuário tenha uma base de dados no mysql. Por exemplo:

usuário aplicação => banco de dados

root => bd_root
admin => bd_admin
user => bd_user

Os usuários poderão se cadastrar no sistema, portanto eu já tenho uma forma de criar automaticamente a base de dados quando o usuário se cadastra. Até aí tudo bem… No entanto, estou com alguns problemas na hora de criar o entityManager.

Primeiramente, preciso de criar o entityManager em tempo de execução sem a necessidade de um persistence.xml. Acho que isso é possível, mas vi em algumas outras fontes dizendo que não tem como. Aparentemente é só criar um Properties e passar para entityManagerFactory. Temo como fazer isso, certo?

Segundo e mais importante: preciso de saber qual usuário usa qual entityManager. Pensei em montar um hashmap<String, EntityManager> estático e guardar na sessão do usuário um atributo com a chave string para o entityManager a ser usado. Percebi que desse modo vou ter que criar e destruir esses objetos todos na mão e isso me pareceu uma má ideia porque vou deixar entityManager desnecessariamente na memória, a criação desses objetos é custosa, etc. Alguma solução melhor do que essa?

PS: Colocar tudo em uma base de dados só não é uma solução.

2 Respostas

T

Para cada banco de dados tu vai criar uma persistenceunit e dentro da tag você coloca a configuração de cada banco de dados, sendo assim quando tu for criar EntityManager você referencia ao qual banco da dados.

Andrauss

Fiz isso recentemente no JPA (o qual só comecei a trabalhar agora), faz o seguinte:

1- Crie um pesistence.xml somente com o nome da unidade de persistência e o mapeamento das entidades (se quiser)
2- Crie uma classe utilitária para criar seu EntityManager, chamei de JPAUtil, com o código a seguir:
Obs.: Estou usando o hibernate, use as propriedades da implementação que estiver usando.

` private static EntityManagerFactory emf;
private static EntityManager manager;

public static void conecta(String usuario, String senha, String url) throws Exception {

    Map<String, String> config = new HashMap<>();

    config.put("hibernate.connection.username", usuario);
    config.put("hibernate.connection.password", senha);
    config.put("hibernate.connection.url", url);
    config.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
    
    // Nome da unidade de persistência e configurações
    emf = Persistence.createEntityManagerFactory("persistence", config);

}

public static EntityManager getEntityManager() {
    return emf.createEntityManager();
}`
Criado 11 de agosto de 2016
Ultima resposta 30 de nov. de 2016
Respostas 2
Participantes 3