我已经在网上和该网站上搜索了答案。尽管我通过Google搜索找到了一个链接,但随后我丢失了该链接,无法再次找到它。
我一直在运行在Glassfish 4.1.1上的电子商务网站上,该网站最初使用EclipseLink 2.6.4拥有一个数据库(DB),但是现在它需要三个驻留在多个服务器上(以保留客户数据)安全)。该站点在单个数据库上运行良好。我将来自单个数据库的数据分为三个部分。 J2EE代码中定义的实体和JPA控制器都是相同的(我保留了代码,因此不必重写所有内容,只需要进行一些小的更改,例如注释等),但是它们现在位于三个不同的MySQL中数据库。这三个数据库之间具有相互关系。
理论上(并根据我所看到和失去的链接),可以定义一个复合持久性单元(PU),以将三个不同数据源的所有三个PU都合并到一个JAR文件中,并使用标记进行实体PU映射。大多数示例(以及Eclipselink和Oracle Persistence API文档)都使用带有多个JAR文件(例如:https://github.com/forgemo/eclipselink-composite-persistence-unit-example)的Composite PU。
谁能为我指出正确的方向,如何创建复合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]使用非实体[com.class。 mysite.myproject.Database.Customer]作为部署时在关系属性[field customer]“中的目标实体)。
最佳答案
事实证明,似乎不需要复合持久性单元(这可能解释了为什么没人能回答这个问题,并且关于它们的文档很少)。
在发现了Glassfish,Geronimo,WebLogic和Ecplipselink和NetBeans中的许多错误之后,我终于能够使用多个持久性单元(PU)而不使用复合PU来使系统正常工作。 JTA能够保留所有实体,包括它们对自己PU之外的实体的引用。进行这项工作的一个关键因素是,通过将其添加到persistence.xml中的PU定义中,确保不排除不属于PU的类的情况:
<exclude-unlisted-classes>false</exclude-unlisted-classes>
如以下完整的PU示例(我在项目中使用的三个示例之一):
<persistence-unit name="DHWPU" transaction-type="JTA">
<jta-data-source>jdbc/dhw</jta-data-source>
<class>Database.AuditTable</class>
<class>Database.Cart</class>
<class>Database.Category</class>
<class>Database.Images</class>
<class>Database.Items</class>
<class>Database.Manufacturer</class>
<class>Database.Procedures</class>
<class>Database.Purchases</class>
<class>Database.TaxTables</class>
<class>Database.Warehouse</class>
<class>Database.Wishlist</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="none"/>
<property name="eclipselink.logging.level" value="FINE"/>
</properties>
</persistence-unit>