我有一个使用 Java servlets/JSP 的应用程序。有多个客户端使用我的应用程序,但是每个客户端都有一个单独的数据库。所有数据库都具有相同的架构。我想确定在用户登录系统时使用哪个数据库连接。
例如客户端A登录,我确定客户端A属于数据库C,获取数据库C的连接并继续我的快乐方式。
我将 JPA 与 Hibernate 一起用作我的 JPA 提供程序。是否可以使用多个持久性单元并确定在登录时使用哪个单元来做到这一点?有没有更好/首选的方法来做到这一点?
编辑添加: 我正在使用注释和 EJB,因此在 EJB 中使用 @PersistenceContext(unitName = "blahblah") 设置持久性上下文,这可以在登录时确定吗?我可以在运行时更改 unitName 吗?
谢谢
最佳答案
1) 在您的 persistence.xml
中创建多个具有不同名称的持久单元。
2) 创建必要数量的 EntityManagerFactory
(每个持久性单元 1 个)并指定具体工厂应使用哪个持久性单元:
<bean id="authEntityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="SpringSecurityManager"/>
</bean>
3) 创建必要数量的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 中有 OpenEntityManagerInViewFilter
,则在其 init-param 名称中指定必要的 EntityManagerFactory(或使用对应的 init-blocks 创建多个过滤器):
<init-param>
<param-name>entityManagerFactoryBeanName</param-name>
<param-value>authEntityManagerFactory</param-value>
</init-param>
关于java - 如何使用 JPA 连接到多个数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2311614/