使用单个JAR文件的复合持久性单元

时间:2017-08-08 23:12:58

标签: mysql jpa java-ee eclipselink persistence.xml

我已经在网站和网站上搜索了答案。虽然我通过Google搜索找到了一个链接,但后来我丢失了链接,无法再找到它。

我一直致力于在Glassfish 4.1.1上运行的电子商务网站,该网站最初使用EclipseLink 2.6.4拥有一个数据库(DB),但它现在需要三个将驻留在多个服务器上(为了保持客户数据安全)。该站点在单个DB上运行良好。我将数据从单个DB拆分为三个。 J2EE代码中定义的实体和JPA控制器都是相同的(我保留了代码,因此我不必重写所有内容,只进行诸如注释等的微小更改),但它们现在位于三个不同的MySQL数据库。这三个数据库之间存在关系。

理论上(根据我看到并丢失的链接),可以定义一个复合持久性单元(PU),将三个不同数据源的所有三个PU合并到一个JAR文件中,并使用标签对于实体-PU映射。大多数示例(以及Eclipselink和Oracle Persistence API文档)使用具有多个JAR文件的Composite 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表之间的关系导致&#34; [class com.mysite.myproject.Database.Wishlist]使用非-entity [class com.mysite.myproject.Database.Customer]作为关系属性[field customer]中的目标实体&#34;在部署时。

1 个答案:

答案 0 :(得分:0)

事实证明,似乎不需要复合持久性单元(这可能解释了为什么没人能回答这个问题,而且几乎没有关于它们的文档)。

在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>