代码之家  ›  专栏  ›  技术社区  ›  kgrad

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

  •  19
  • kgrad  · 技术社区  · 15 年前

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

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

    我使用带有Hibernate的JPA作为JPA提供程序。是否可以使用多个持久性单元并确定在登录时使用哪个单元?有没有更好的/首选的方法?

    编辑添加: 我使用的是注释和EJB,所以持久性上下文是在EJB中用@persistence context(unitname=“blahblah”)设置的,这可以在登录时确定吗?我可以在运行时更改UnitName吗?

    谢谢

    1 回复  |  直到 9 年前
        1
  •  19
  •   Roman    15 年前

    1)在您的 persistence.xml 有不同的名字。

    2)创建必要数量的 EntityManagerFactory s(每个持久性单位1个)并指定混凝土工厂应使用的持久性单位:

    <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的类中,指定要使用哪个持久性单元(以及使用哪个EntityManagerFactory):

    public class AbstractAuthDao<T> { 
    
       @PersistenceContext (unitName = "SpringSecurityManager")
       protected EntityManager em;
    
        ...
    }
    

    5)在服务对象中,指定应使用哪个TransactionManager(此功能仅在Spring3.0中受支持):

    @Transactional (value = "authTransactionManager", readOnly = true)
    public class UserServiceImpl implements UserService {
    
       ...
    }
    

    6)如果你有 OpenEntityManagerInViewFilter 在web.xml中,然后在其init参数中指定必要的EntityManagerFactory的名称(或使用相应的init块创建几个筛选器):

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