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

Dea*_*lze 1 persistence.xml jpa-2.0

我正在编写一个Java SE(桌面)应用程序,它必须访问不同的数据库,所有这些数据库都具有相同的数据模型(相同的模式,表格等).我想重用已经在每个数据库前面的Java EE应用程序中使用的JPA实体.

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

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

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

我不想用Web服务接口构建Java EE应用程序,只是为了支持这个桌面应用程序.Java EE应用程序有不同的用途,我希望将桌面功能保留在桌面应用程序中.

谢谢.

Nay*_*kar 6

您可以通过提供属性在运行时创建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);
Run Code Online (Sandbox Code Playgroud)

您还可以尝试使用属性文件,在运行时将属性加载到地图中.因此,它将数据库配置与代码分离.

编辑:属性键(JDBC_URL等)是特定于供应商的,应相应地替换它们.