Как я соединяюсь с несколькими базами данных с помощью JPA?

У меня есть приложение с помощью servlets/JSP's Java. Существует несколько клиентов, использующих мое приложение, однако у каждого клиента есть отдельная база данных. Все базы данных имеют ту же схему. Я хотел бы определить, какое соединение с базой данных использовать в то время, когда пользователь входит в систему.

Например, клиент журналы в, я решаю, что клиент A принадлежит базе данных C, захватите соединение для базы данных C и продолжите мой веселый путь.

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

Отредактированный для добавления: Я использую аннотации и EJB's, таким образом, Контекст Персистентности устанавливается в EJB с @PersistenceContext (unitName = "чепуха"), это может быть определено во время входа в систему? Я могу изменить unitName во времени выполнения?

Спасибо

19
задан kgrad 22 February 2010 в 15:15
поделиться

1 ответ

1) Создайте несколько постоянных единиц в вашем persistence.xml с разными именами.

2) Создайте необходимое количество EntityManagerFactorys (1 на persistence-unit) и укажите, какой persistence-unit должен использоваться для конкретной фабрики:

<bean id="authEntityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
   <property name="persistenceUnitName" value="SpringSecurityManager"/>
</bean>

3) Создайте необходимое количество TransactionManager s:

<bean id="authTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
   <property name="entityManagerFactory" ref="authEntityManagerFactory" />
</bean>

4) В классах ваших DAO укажите, с какой persistence-unit (и, соответственно, с какой EntityManagerFactory) вы хотите работать:

public class AbstractAuthDao<T> { 

   @PersistenceContext (unitName = "SpringSecurityManager")
   protected EntityManager em;

    ...
}

5) В ваших сервис-объектах укажите, какой TransactionManager должен использоваться (эта возможность поддерживается только в Spring 3. 0):

@Transactional (value = "authTransactionManager", readOnly = true)
public class UserServiceImpl implements UserService {

   ...
}

6) Если в вашем web.xml есть OpenEntityManagerInViewFilter, то укажите в его init-param имя нужного EntityManagerFactory (или создайте несколько фильтров с соответствующими init-блоками):

<init-param>
    <param-name>entityManagerFactoryBeanName</param-name>
    <param-value>authEntityManagerFactory</param-value>
</init-param>
19
ответ дан 30 November 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: