Динамическое соединение JPA - PullRequest
9 голосов
/ 05 ноября 2010

У меня довольно стандартное веб-приложение на Java EE6, использующее JPA 2 с внедрением зависимостей, подключающееся к базе данных MySQL, и все работает нормально.Теперь я хотел бы, чтобы это приложение взаимодействовало с базами данных других приложений, которые мы установили на клиентском сайте - по сути, выступая в качестве единой точки контроля для установки других наших приложений.

Что яборется с тем, как лучше всего выполнять взаимодействие с другими базами данных.В идеале я хотел бы создать EntityManager для каждой установки и взаимодействовать с использованием JPA, но я не вижу никакого способа настроить это.Например, у меня может быть 5 установок (и, следовательно, баз данных) одного типа приложения, и главное управляющее приложение не будет знать о других установках до времени выполнения.По-видимому, это исключает использование внедрения зависимостей EntityManager и всех автоматических демакций транзакций и т. Д. И т. Д. Альтернативный вариант - просто создать источник данных и выполнить взаимодействия вручную.Хотя гибкость это явно требует гораздо больше усилий.

Итак, мой вопрос на самом деле: как мне лучше всего решить эту проблему?

1 Ответ

5 голосов
/ 08 марта 2011

Я также изучаю это, и пока что нашел следующий пост в блоге, в котором описан способ сделать это http://ayushsuman.blogspot.com/2010/06/configure-jpa-during-run-time-dynamic.html:

Удалены все свойства вашей базы данных из файла persistance.xml

<persistence>
<persistence-unit name="jpablogPUnit" transaction-type="RESOURCE_LOCAL">
<class>com.suman.Company</class>
</persistence-unit>
</persistence>

Изменен ваш Java-файл, в котором вы конфигурируете entityManager, в нашем случае TestApplication.java

package com.suman;

import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.apache.log4j.Logger;

/**
* @author Binod Suman
*/
public class TestApplication {

Logger log = Logger.getLogger(TestApplication.class);
public static void main(String[] args) {
TestApplication test = new TestApplication();
test.saveCompany();
}

public void saveCompany(){
log.info("Company data is going to save");
EntityManagerFactory emf;
Map properties = new HashMap();
properties.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
properties.put("hibernate.connection.url", "jdbc:mysql://localhost:3306/sumandb");
properties.put("hibernate.connection.username", "root");
properties.put("hibernate.connection.password", "mysql");
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
properties.put("hibernate.show-sql", "true");
//emf = Persistence.createEntityManagerFactory("jpablogPUnit");
emf = Persistence.createEntityManagerFactory("jpablogPUnit",properties);
EntityManager entityManager = (EntityManager) emf.createEntityManager();
entityManager.getTransaction().begin();
Company company = new Company(120,"TecnoTree","Espoo, Finland");
entityManager.persist(company);
entityManager.getTransaction().commit();
log.info("Company data has been saved");
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...