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

2022-09-02 01:46:21

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

例如客户端A登录,我确定客户端A属于数据库C,获取数据库C的连接并继续我快乐的方式。

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

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

谢谢


答案 1

1)使用不同的名称在中创建几个持久单元。persistence.xml

2) 创建必要数量的 s(每个持久性单元 1 个),并指定具体工厂应使用哪个持久性单元:EntityManagerFactory

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

3) 创建必要数量的 s:TransactionManager

<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)如果你在你的web.xml,那么在其初始化参数名称中指定必要的EntityManagerFactory(或者使用相应的初始化块创建几个过滤器):OpenEntityManagerInViewFilter

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

答案 2

推荐