Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将动态JNDI数据源与JPA一起使用?_Java_Hibernate_Jpa - Fatal编程技术网

Java 如何将动态JNDI数据源与JPA一起使用?

Java 如何将动态JNDI数据源与JPA一起使用?,java,hibernate,jpa,Java,Hibernate,Jpa,我们有一个应用程序,它使用多个数据库存储不同国家的相同数据 例如,订阅对象可能与德国或西班牙关联。如果是德语订阅,则需要将其存储在与西班牙语订阅不同的数据库中。这些数据库的结构相同,但内容不同 我们在jboss 5上运行,每个都有一个不同的datasource config(*ds.xml)文件,在启动时动态生成。它们存储在JNDI中,所以我们有数据源、数据源等 它应该是这样工作的:如果请求中说“FetchSubscription 17 for Germany”,那么我计算数据源应该是DataS

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

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

我们在jboss 5上运行,每个都有一个不同的datasource config(*ds.xml)文件,在启动时动态生成。它们存储在JNDI中,所以我们有数据源、数据源等

它应该是这样工作的:如果请求中说“FetchSubscription 17 for Germany”,那么我计算数据源应该是DataSourceDE,并使用JPA/hibernate从正确的数据库中获取该对象。西班牙语数据库中也将有一个订阅17,我不希望在本例中使用它

我可以自动生成persistence.xml来为数据源创建额外的持久性单元,但是
Subscription
类使用以下注释:

@PersistenceContext(unitName="core")

这是行不通的-如何在java对象上动态设置持久性上下文?

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

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

您试图实现的目标称为多租户。这里有一个非常适合你的问题的教程,可以让它发挥作用

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


谢谢,这是一个很好的参考资料。希望我能够使它适应我的需要(我们没有使用EJB3)。