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

标签 mysql jpa jakarta-ee eclipselink persistence.xml

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

我一直在开发一个运行在 Glassfish 4.1.1 上的电子商务网站,该网站最初只有一个使用 EclipseLink 2.6.4 的数据库 (DB),但现在需要三个驻留在多个服务器上(以便确保客户数据安全)。该站点在单个数据库上运行良好。我将单个数据库中的数据分成三个。 J2EE代码中定义的entities和JPA controller都是一样的(我保留了代码,这样就不用重写了,只做注解等小改动),但是现在分别位于三个不同的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] 使用非实体 [类 com.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>

关于mysql - 使用单个 JAR 文件的复合持久性单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45579340/

相关文章:

mysql - 将 Winforms 客户端连接到 linux 服务器上的 mysql

java - 从支持 bean 设置参数

mysql - JPA通过比较本地列和连接表列的查询顺序?

jakarta-ee - 用于将 Quartz 与 CDI 一起使用的自定义 CDJobFactory

java ee 在 OSX 上安装失败

php - 从不同的表中查询相同的字段

PHP/SQL 将查询结果分组到数组中

mysql - 在对索引列进行排序时,如何避免在具有大表的 MySQL 中选择糟糕的执行计划?

java - Java 中的 GAE 数据存储 + JPA + Odata

java - hibernate buildSessionFactory类格式错误: