1

我想使用一个类和两个 JPA 持久性单元,因此能够将数据存储在不同的表(甚至数据库)和不同的定义中。

根据 JPA2.2 规范,这应该是可能的,但我遇到了奇怪的行为。我正在使用使用 eclipselink 的 payara。

有关完整描述和复制器,请参阅此github 项目

我希望有一个人可以帮助我。

4

1 回答 1

2

这不起作用的原因是eclipselink weaving。这样做是操纵实体类的字节码以扩展它们的功能,从而提供各种优化。

然而,问题是生成的“编织”类取决于persistence.xml 和orm.xml 中定义的定义。

这意味着在我的情况下,因为我有两个不同的 persistence.xml/orm.xml 组合,我需要两个反映不同功能的 Foo.class 和 Bar.class 文件。这当然行不通。

解决方案是关闭编织,这可以使用 persistence.xml 中的属性来完成

<property name="eclipselink.weaving" value="off"/>

如果您想查看实际的“编织”类,您可以使用静态编织。这可以使用这个属性来完成

<property name="eclipselink.weaving" value="static"/>

和这个Maven 插件

<plugin>
    <groupId>de.empulse.eclipselink</groupId>
    <artifactId>staticweave-maven-plugin</artifactId>
    <version>1.0.0</version>
    <executions>
      <execution>
        <phase>process-classes</phase>
        <goals>
          <goal>weave</goal>
        </goals>
        <configuration>
          <persistenceXMLLocation>META-INF/persistence.xml</persistenceXMLLocation>
          <logLevel>FINE</logLevel>
        </configuration>
      </execution>
    </executions>
    <dependencies>
      <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>org.eclipse.persistence.jpa</artifactId>
        <version>2.7.7.payara-p3</version>
      </dependency>
    </dependencies>
  </plugin>

然后,当您构建项目时,您可以反编译 jar 中的类以查看发生了什么。

谢谢你Cris给我指点 eclipselink weaving。

于 2022-01-28T16:22:45.107 回答