具有多个数据库的JPA(Hibernate)

时间:2014-02-04 17:31:24

标签: java hibernate jpa jpa-2.0

这是我在工作中遇到的挑战: 我们有一个java Web应用程序和几个数据库(每个客户一个)(每个客户使用相同的数据库/元数据)。此外,还有一个中央数据库,可以保存客户信息,例如数据库URL等。

在登录屏幕上,用户通知客户ID,登录和密码,点击登录按钮,然后首先将Web应用程序转到中央数据库,以便找到客户数据库的URL(我有一个单独的实体管理器工厂)然后它返回并为该客户数据库创建一个新的实体管理器工厂。到目前为止,我可以看到客户1的数据。

然而,当我注销并尝试使用不同的客户ID(这意味着不同的数据库)登录时,之前创建的实体管理器工厂仍然“连接”到先前客户的数据库,即使应用程序传递了参数包含新数据库URL的映射。

我的问题是,是否有办法让JPA连接到不同的数据库,而无需为每个客户创建实体管理器工厂。我知道EntityManagerFactory对象缓存了所有数据库元数据,所以有没有办法改变数据库url属性并刷新工厂?

谢谢,

木桥

3 个答案:

答案 0 :(得分:3)

  

我的问题是,是否有办法让JPA连接到不同的数据库而无需为每个客户创建实体管理器工厂。

我不这么认为。

请参阅Nayans在这里的回答:When should EntityManagerFactory instance be created/opened?以获得更多见解。

答案 1 :(得分:1)

实际上,在挖掘Google之后,我发现从Hibernate 4.x开始引入Multi tenancy support这就是我需要的东西。接下来的挑战是从纯JPA而不是直接使用Hibernate来实现,并认为它会很难。

答案 2 :(得分:0)

您可以尝试使用Hibernate 4多租户功能,我也使用过它。只需按照有关如何配置它的文档https://docs.jboss.org/hibernate/core/4.2/devguide/en-US/html/ch16.html

如果您已经使用JPA,只需将JPA提供程序更改为使用Hibernate。 EntityManager只是Hibernate Session的包装器。只要您提供CurrentTenantIdentifierResolver

的实现,Hibernate就会自动切换数据库连接