Olá,
Tenho exatamente o mesmo problema.
Estou pensando no seguinte:
Colocar o mapeamento em algum outro arquivo, criar um script para gerar meu persistence.xml e meu xml do datasource(estou usando jboss), já que tenho(e imagino q vc tb) todas as informações das conexões dos clientes em um banco de dados.
Essa é a parte de configuração, na parte de código, criei uma Factory que cria EntityManagerFactory de acordo com o cliente, ficou assim:
public EntityManagerFactory createEnityManagerFactory(Customer customer) {
HashMap<String, String> prop = new HashMap<String, String>();
prop.put("hibernate.dialect",
"org.hibernate.dialect.MySQLDialect");
prop.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
prop.put("hibernate.show_sql", "true");
prop.put("hibernate.format_sql", "true");
prop.put("hibernate.connection.username", customer.getMysqlUser());
prop.put("hibernate.connection.password", customer.getMysqlPassword());
prop.put("hibernate.connection.url", "jdbc:mysql://localhost:3306/"
+ customer.getMysqlDatabase());
return Persistence.createEntityManagerFactory(customer.getMysqlDatabase(), prop);
}
Nesse código percebe-se que:
Tenho um persistence-unit por cliente.
Procurei bastante a solução para isso na internet, infelizmente não achei nada que pudesse ajudar, se voce achar algo, por favor me avise tb, pq a “solução” que encontrei não me parece a mais adequada, embora funcione.
O principal ponto aqui é o atributo do persistence.xml, se ele pudesse ser informado via configuração, como os outros parâmetros que usei acima, poderia ter apenas um persistence-unit, assim não seria obrigado a alterar esse xml que força o redeploy de minha aplicação. Mas, pelo que vi e pesquisei, apenas os parâmetros referentes ao hibernate podem ser informados em tempo de execução.
Se houver uma forma de passar isso como parâmetro, resolvemos o problema, fazendo com que apenas o arquivo dos datasources tenha que conter todas as informações do cliente, não sendo assim necessário fazer um redeploy de toda a aplicação para cada novo cliente.
A única forma que encontrei foi fazer com que a forma de transação usada deixe de ser JTA para ser RESOURCE_LOCAL, assim não necessitante de um jta-data-source, porém, com isso, todo o gerenciamento de transações cai na mão do desenvolvedor, sendo assim mais propenso a falhas, e se não me engano(não fui mto a fundo nessa solução) o Jboss tem alguma limitação quanto a se uso.
Vejo cada vez mais essa situação se repetir para vários desenvolvedores, mas até agora não vi nenhuma solução satisfatória, se encontrar algo interessante, por favor não deixe de postar aqui
Abraço,
Pedro Sena