Подтвердить что ты не робот

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

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

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

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

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

Спасибо

4b9b3361

Ответ 1

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

2) Создайте необходимое количество EntityManagerFactory (1 на единицу измерения) и укажите, какой блок персистентности следует использовать для конкретного factory:

<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 (и так с помощью 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) Если у вас есть OpenEntityManagerInViewFilter в вашем web.xml, укажите в его имени init-param необходимый EntityManagerFactory (или создайте несколько фильтров с соответствующими init-block):

<init-param>
    <param-name>entityManagerFactoryBeanName</param-name>
    <param-value>authEntityManagerFactory</param-value>
</init-param>