首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用JPA连接到多个数据库?

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

Stack Overflow用户
提问于 2010-02-22 22:52:00
回答 1查看 21.4K关注 0票数 22

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

例如,客户端A登录,我确定客户端A属于数据库C,抓取数据库C的连接,然后继续我的快乐之路。

我使用JPA和Hibernate作为我的JPA提供程序。是否可以使用多个持久性单元并确定在登录时使用哪个单元来完成此任务?有没有更好/更好的方法来做这件事?

编辑后添加:我正在使用注释和EJB,所以在EJB中使用@PersistenceContext(unitName = "blahblah")设置持久化上下文,这可以在登录时确定吗?我可以在运行时更改unitName吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-02-22 22:57:34

1)在您的persistence.xml中创建多个具有不同名称的持久单元。

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

代码语言:javascript
复制
<bean id="authEntityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
   <property name="persistenceUnitName" value="SpringSecurityManager"/>
</bean>

3)创建所需数量的TransactionManager

代码语言:javascript
复制
<bean id="authTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
   <property name="entityManagerFactory" ref="authEntityManagerFactory" />
</bean>

4)在DAO的类中指定要使用的持久性单元(以及EntityManagerFactory):

代码语言:javascript
复制
public class AbstractAuthDao<T> { 

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

    ...
}

5)在你的服务对象中指定应该使用哪个TransactionManager (这个特性只在Spring3.0中被支持):

代码语言:javascript
复制
@Transactional (value = "authTransactionManager", readOnly = true)
public class UserServiceImpl implements UserService {

   ...
}

6)如果您的web.xml中有OpenEntityManagerInViewFilter,那么在它的初始参数名称中指定必要的块(或者使用相应的初始块创建几个过滤器):

代码语言:javascript
复制
<init-param>
    <param-name>entityManagerFactoryBeanName</param-name>
    <param-value>authEntityManagerFactory</param-value>
</init-param>
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2311614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档