2017-08-08 86 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>