一尘不染

如何使用JPA连接到多个数据库?

hibernate

我有一个使用Java Servlet /
JSP的应用程序。我的应用有多个客户端,但是每个客户端都有一个单独的数据库。所有数据库都具有相同的架构。我想确定用户登录系统时要使用哪个数据库连接。

例如,客户端A登录后,我确定客户端A属于数据库C,抓住了数据库C的连接,然后继续愉快地进行操作。

我正在将JPA与Hibernate一起用作我的JPA提供程序。是否可以使用多个持久性单元并在登录时确定使用哪个单元来执行此操作?有没有更好/更好的方法来做到这一点?

编辑添加:我正在使用批注和EJB,因此使用@PersistenceContext(unitName =“
blahblah”)在EJB中设置了持久性上下文,这可以在登录时确定吗?我可以在运行时更改unitName吗?

谢谢


阅读 736

收藏
2020-06-20

共1个答案

一尘不染

1)在您的帐户中persistence.xml使用不同的名称创建多个持久性单元。

2)创建必要的EntityManagerFactorys(每个持久性单位为1),并指定具体工厂应使用哪个持久性单位:

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

3)创建必要的TransactionManagers 数:

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

4)在您的DAO的类中,指定您要使用哪个持久性单元(以及哪个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-blocks创建多个过滤器):

<init-param>
    <param-name>entityManagerFactoryBeanName</param-name>
    <param-value>authEntityManagerFactory</param-value>
</init-param>
2020-06-20