2017-08-08 55 views
1

我已经搜索了网站,并且本网站已经寻找答案。虽然我通过Google搜索找到了一个链接,但后来我失去了链接,无法再找到它。使用单个JAR文件的复合持久性单元

我一直在研究一个运行在Glassfish 4.1.1上的电子商务网站,该网站最初有一个使用EclipseLink 2.6.4的单一数据库(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文件(musltiple的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表之间的关系导致“[com.mysite.myproject.Database.Wishlist]使用非实体[class com.mysite.myproject.Database.Customer]作为关系属性[field客户]“部署)。

+0

我认为“复合PU”是不是像“故障安全JPA农场”一样的想法。所有示例都显示,“组合”的目标是连接工作集中逻辑上不同的模块。它没有什么高阻力,说实话,有更多的点在哪里“sh..t发生” –

+0

我现在假设没有人可以回答这个问题。在我所有的搜索中,我都没有找到答案,即使在问其他Java工程师时也是如此。 –

回答

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> 
相关问题