Spring + Hibernate + JPA + несколько баз данных - PullRequest
3 голосов
/ 02 января 2012

У меня есть приложение Spring + Hibernate + JPA.Пользователь при входе в систему может выбрать из списка БД для подключения (это требования).Все базы данных имеют одинаковую схему, поэтому будут использоваться одни и те же сущности и DAO.

Сейчас у меня есть один EntityManager (на данный момент работающий с одной базой данных), который внедряется в DAO следующим образом:

@PersistenceContext
private EntityManager entityManager;

Есть ли способ, чтобы DAO автоматически получал entityManager (управляемый Spring) на основе параметра / свойства, полученного от уровня обслуживания?(Веб-слой отправляет своего рода контекст, и там будет находиться имя / код / ​​идентификатор выбранной базы данных.)

Или я должен управлять этим сам (создавая все EntityManager, помещая их вкарта, сообщающая DAO, какой из них использовать для каждого вызова)?

Я провел некоторое исследование, прежде чем задавать этот вопрос, но результаты были неубедительными - большинство вопросов касалось модели, распределенной на 2 или болееБД и транзакции, охватывающие несколько БД, но это не так для меня.

В моем случае, когда пользователь подключен, все равно, что он подключился к приложению, в котором есть только один диспетчер сущностей - тот, что для выбранной им базы данных.Там нет переключения между середине сеанса DB или любой другой такой вещи.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 02 января 2012

Эта функция называется многопользовательской.

Hibernate 4 должен поддерживать ее «из коробки», хотя я не уверен, может ли она быть интегрирована с Spring-managed EntityManager.

В качестве альтернативы, самый простой способ сделать это - перехватить создание соединений с базой данных на уровне ConnectionProvider или на уровне DataSource и выбрать соответствующую базу данных на основе идентификатора клиента, хранящегося в переменной ThreadLocal.

См. Также:

1 голос
/ 07 сентября 2012

Весной вы можете динамически построить EntityManagerFactory с конфигурацией Annotation (AnnotationWebConfiguration), используя что-то вроде этого:

@Configuration
public class MyAppConfig{
   public LocalContainerEntityManagerFactoryBean getEmf(){
       LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean ();
       Datasource ds = new .... ; // HERE!! you can create and configure your datasource to point to whatever you need
       emf.setName("system_pu");
       emf.setDatasource(ds);
       emf.setPackagesToScan(""); //optional if no persistence.xml is defined
       return emf;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...