【发布时间】:2018-01-16 16:10:42
【问题描述】:
我已经在网上和这个网站上搜索过答案。虽然我通过 Google 搜索找到了一个链接,但后来我丢失了该链接,再也找不到了。
我一直在研究一个在 Glassfish 4.1.1 上运行的电子商务网站,该网站最初有一个使用 EclipseLink 2.6.4 的数据库 (DB),但现在它需要三个驻留在多台服务器上的数据库(为了保持客户数据安全)。该站点在单个数据库中运行良好。我将单个数据库中的数据分成三个。 J2EE 代码中定义的实体和 JPA 控制器都是相同的(我保留了代码,因此我不必重写所有内容,只需进行一些小的更改,例如注释等),但它们现在位于三个不同的 MySQL 中数据库。这三个数据库相互关联。
理论上(根据我看到并丢失的链接)可以定义一个复合持久性单元 (PU),以将三个不同数据源的所有三个 PU 合并到一个 JAR 文件中,并使用实体标签 - PU 映射。大多数示例(以及 Eclipselink 和 Oracle Persistence API 文档)使用带有多个 JAR 文件的复合 PU(例如:https://github.com/forgemo/eclipselink-composite-persistence-unit-example)。
谁能指出我正确的方向,如何创建复合 PU,而不必为每个数据库 PU 使用单独的 JAR 文件?
我目前的persistence.xml文件(多个PU但不是复合)如下:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
>
<persistence-unit name="PU1" transaction-type="JTA">
<jta-data-source>java:app/jdbc/db1</jta-data-source>
<class>com.mysite.myproject.Database.Items</class>
<class>com.mysite.myproject.Database.Manufacturer</class>
<class>com.mysite.myproject.Database.Category</class>
<class>com.mysite.myproject.Database.Cart</class>
<class>com.mysite.myproject.Database.AuditTable</class>
<class>com.mysite.myproject.Database.Images</class>
<class>com.mysite.myproject.Database.Procedures</class>
<class>com.mysite.myproject.Database.Warehouse</class>
<class>com.mysite.myproject.Database.Wishlist</class>
<class>com.mysite.myproject.Database.Purchases</class>
<class>com.mysite.myproject.Database.TaxTables</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="eclipselink.logging.level" value="FINE"/>
</properties>
</persistence-unit>
<persistence-unit name="PU2" transaction-type="JTA">
<jta-data-source>java:app/jdbc/db2</jta-data-source>
<class>com.mysite.myproject.Database.AccessList</class>
<class>com.mysite.myproject.Database.Users</class>
<class>com.mysite.myproject.Database.Customer</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="eclipselink.logging.level" value="FINE"/>
</properties>
</persistence-unit>
<persistence-unit name="PU3" transaction-type="JTA">
<jta-data-source>java:app/jdbc/db3</jta-data-source>
<class>com.mysite.myproject.Database.Key1</class>
<class>com.mysite.myproject.Database.Key2</class>
<class>com.mysite.myproject.Database.Key3</class>
<class>com.mysite.myproject.Database.Key4</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
<property name="eclipselink.logging.level" value="FINE"/>
</properties>
</persistence-unit>
只要数据源之间没有关系,上述 persistence.xml 就可以正常工作(例如 - Wishlist 和 Customer 表之间的关系导致“[class com.mysite.myproject.Database.Wishlist] 使用非实体 [ class com.mysite.myproject.Database.Customer] 作为关系属性 [field customer] 中的目标实体”在部署时)。
【问题讨论】:
-
我认为“复合 PU”与“故障安全 JPA 农场”不同。所有的例子都表明,“复合”的目标是连接工作集中逻辑上不同的模块。说实话,它没有什么高阻力,有更多“sh..t发生”的地方
-
我现在假设没有人可以回答这个问题。在我所有的搜索中,我都没有找到一个答案,即使是在询问其他 Java 工程师时也是如此。
标签: mysql jpa jakarta-ee eclipselink persistence.xml