如何在JPA中使用动态JNDI数据源?

时间:2015-05-13 10:12:26

标签: java hibernate jpa

我们有一个应用程序,它使用多个数据库为不同的国家/地区存储相同的数据。

例如,Subscription对象可能与德国或西班牙相关联。如果是德语订阅,则需要将其存储在与西班牙语订阅不同的数据库中。数据库结构相同,但内容不同。

我们正在jboss 5上运行,并且每个文件都有一个不同的数据源配置(* ds.xml)文件,在启动时动态生成。它们存储在JNDI中 - 因此我们有DataSourceDE,DataSourceES等。

以下是它应该如何工作:如果请求进入'为德国提取订阅17',那么我计算数据源应该是DataSourceDE并使用JPA / hibernate从正确的数据库中获取该对象。西班牙语数据库中也会有一个订阅17,在这个例子中我不想要。

我可以自动生成persistence.xml以为数据源创建额外的持久性单元,但@PersistenceContext(unitName="core") 类使用以下内容进行注释:

execute

这不起作用 - 如何动态设置java对象的持久化上下文?

2 个答案:

答案 0 :(得分:4)

您要实现的目标称为多租户。这是一个非常适合您的问题的教程,使其工作。

主要思想是使用无状态会话bean ,它引用了两个持久性单元。根据必须执行的操作,此bean执行查找以调用相应的EntityManager。此外:

Multi-Tenancy With EJB 3.1 and JPA 2.0

答案 1 :(得分:2)

您可以在运行时更改EntityManager的持久性上下文,如下所示:

EntityManagerFactory emf = 
    Persistence.createEntityManagerFactory(persistenceUnitName);
EntityManager em = emf.createEntityManager();