Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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
Jpa 2.0 如何使JPA应用程序访问不同的数据库?_Jpa 2.0_Persistence.xml - Fatal编程技术网

Jpa 2.0 如何使JPA应用程序访问不同的数据库?

Jpa 2.0 如何使JPA应用程序访问不同的数据库?,jpa-2.0,persistence.xml,Jpa 2.0,Persistence.xml,我正在编写一个JavaSE桌面应用程序,它必须访问不同的数据库,所有这些数据库都将具有相同的数据模型、相同的模式、表等。。我希望重用我已经在面向每个数据库的JavaEE应用程序中使用的JPA实体 要重用现有的entity.jar文件,我必须使用一个不同的persistence.xml重新打包它,该persistence.xml有一个本地数据源。这是构建时的不便,但不是大问题 问题是我的桌面应用程序将仅限于使用persistence.xml文件中定义的数据源。我可以定义多个持久性单元,并选择在运行

我正在编写一个JavaSE桌面应用程序,它必须访问不同的数据库,所有这些数据库都将具有相同的数据模型、相同的模式、表等。。我希望重用我已经在面向每个数据库的JavaEE应用程序中使用的JPA实体

要重用现有的entity.jar文件,我必须使用一个不同的persistence.xml重新打包它,该persistence.xml有一个本地数据源。这是构建时的不便,但不是大问题

问题是我的桌面应用程序将仅限于使用persistence.xml文件中定义的数据源。我可以定义多个持久性单元,并选择在运行时使用哪个持久性单元,但当添加新数据库时,我必须更改persistence.xml并更新所有桌面二进制文件

我希望能够在每个用户都可以配置的.properties文件中定义新的数据源。是否有任何方法可以在运行时覆盖或添加到persistence.xml中声明的持久性单元

我不想仅仅为了支持这个桌面应用程序而构建带有web服务接口的JavaEE应用程序。JavaEE应用程序有不同的用途,我希望在桌面应用程序中保留桌面功能


谢谢。

您可以通过提供属性在运行时创建EntityManagerFactory

Map<String, Object> properties = new HashMap<String, Object>();

properties.put(TRANSACTION_TYPE, PersistenceUnitTransactionType.RESOURCE_LOCAL.name());
properties.put(JDBC_DRIVER, driver);
properties.put(JDBC_URL, db_url);
properties.put(JDBC_USER, "userName");
properties.put(JDBC_PASSWORD, "password");

EntityManagerFactory factory = Persistence.createEntityManagerFactory("PERSISTENT_UNIT_NAME", properties);
此外,您还可以尝试创建一个属性文件,在运行时从中将属性加载到映射中。因此,它将使数据库配置与代码分离


编辑:属性keysJDBC\u URL等是特定于供应商的,应该相应地替换它们。

您可以通过提供属性在运行时创建EntityManagerFactory

Map<String, Object> properties = new HashMap<String, Object>();

properties.put(TRANSACTION_TYPE, PersistenceUnitTransactionType.RESOURCE_LOCAL.name());
properties.put(JDBC_DRIVER, driver);
properties.put(JDBC_URL, db_url);
properties.put(JDBC_USER, "userName");
properties.put(JDBC_PASSWORD, "password");

EntityManagerFactory factory = Persistence.createEntityManagerFactory("PERSISTENT_UNIT_NAME", properties);
此外,您还可以尝试创建一个属性文件,在运行时从中将属性加载到映射中。因此,它将使数据库配置与代码分离

编辑:属性keysJDBC\u URL等是特定于供应商的,应相应地进行替换。

Nayan

我需要详述你的答案,因为它不完整

关于使用属性动态创建EntityManager,令人困惑的是JPA中有三个createEntityManagerFactory方法,所有三个方法都使用persistenceunit名称。直到我检查了JPA2.0规范,我才意识到属性覆盖了persistenceunit名称。第9.4.3节说属性覆盖了persistence.xml中给出的值。它还显示了标准属性名称

JavaDocs没有告诉您可以进入属性中的内容,也没有说属性覆盖persistence.xml中的内容。另一个JavaDocs很糟糕的例子

您的示例使用Java EE 6 API Javadocs中没有的属性名,如JDBC_URL。JPA规范解释说,除了标准属性外,还可以使用特定于供应商的属性名称。EclipseLink文档显示了实现通过非标准PersistenceUnitProperties类支持的属性名称:

因此,为了拥有动态实体管理器,必须使用特定于供应商的属性,因此动态实体管理器是不可移植的。我想你不可能什么都有

动态EntityManager可移植的一种情况是通过使用标准javax.persistence.jtaDataSource属性。您必须将数据源添加到JavaEE容器中,但这是在容器中运行时最动态的。在JavaSE中,似乎没有任何可移植的动态选项

JavaDocs需要更好地解释属性如何与createEntityManagerFactory方法一起工作。

Nayan

我需要详述你的答案,因为它不完整

关于使用属性动态创建EntityManager,令人困惑的是JPA中有三个createEntityManagerFactory方法,所有三个方法都使用persistenceunit名称。直到我检查了JPA2.0规范,我才意识到属性覆盖了persistenceunit名称。第9.4.3节说属性覆盖了persistence.xml中给出的值。它还显示了标准属性名称

JavaDocs没有告诉您可以进入属性中的内容,也没有说属性覆盖persistence.xml中的内容。另一个JavaDocs很糟糕的例子

您的示例使用Java EE 6 API Javadocs中没有的属性名,如JDBC_URL。JPA规范解释说,除了标准属性外,还可以使用特定于供应商的属性名称。EclipseLink文档显示了实现通过非标准PersistenceUnitProperties类支持的属性名称:

因此,为了拥有动态实体管理器,必须使用特定于供应商的属性,因此动态实体管理器是不可移植的。我想你不可能什么都有

一种情况下,动态实体管理器将是portab le是通过使用标准的javax.persistence.jtaDataSource属性实现的。您必须将数据源添加到JavaEE容器中,但这是在容器中运行时最动态的。在JavaSE中,似乎没有任何可移植的动态选项


JavaDocs需要更好地解释属性如何与createEntityManagerFactory方法一起工作。

谢谢。我接受你的回答,并在上面进一步阐述。谢谢。我接受你的答案并在上面展开讨论。是的,有些属性留待实现&在规范中找不到。JDBC_URL是通用的&仅用于显示目的&需要由特定于供应商的属性替换。另外,只有两种方法可用于创建工厂,第一种方法使用xml描述的单元名称,另一种方法使用名称和属性。第三种方法使用javax.persistence.spi.PersistenceProvider,看起来它是由供应商实现使用的,通常不用于应用程序开发。是的,有些属性留待实现&在规范中找不到。JDBC_URL是通用的&仅用于显示目的&需要由特定于供应商的属性替换。此外,只有两种方法可用于创建工厂,第一种方法使用xml描述的单元名称,另一种方法使用名称和属性。第三种方法使用javax.persistence.spi.PersistenceProvider,看起来它是由供应商实现使用的,通常不用于应用程序开发。