在EAR文件中,多个EJB JAR可以共享同一个JPA persistence.xml吗?

6
我们的项目有多个EJB模块,我们想在它们之间共享一个单一的persistence.xml文件。
我们将persistence.xml文件放置在EAR的META-INF目录中,但是持久化单元在运行时不可用。似乎文件从未被读取,因为我们强制使用了不正确的类和jar文件,但是什么也没有发生。
为什么WebLogic没有读取EAR内部的persistence.xml文件?
在运行代码时,我们会收到以下错误:找不到PU(可用的持久化单元:[])。
Caused By: java.lang.IllegalArgumentException: No persistence unit named 'em' is available in scope ejb1-module.jar. Available persistence units: []

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="system-unit" transaction-type="JTA">
        <jta-data-source>sysmtem-ds</jta-data-source>
        <jar-file>../ejb1-module.jar</jar-file>
        <class>...</class>
        <class>...</class>
        <class>...</class>
    </persistence-unit>
</persistence>

结构(持久性单元放置在EAR内部)

EAR +
    |- META-INF +
    |       - persistence.xml
    |- ejb1-module.jar
    |- ejb2-module.jar
    |- ejb3-module.jar

我们正在使用WebLogic 10.3.6,它使用的是JPA 1.0和随附的TopLink/EclipseLink。

1
为什么不将它放在一个专用的jar文件中,让所有的ejb模块都依赖于这个额外的jar呢? - mp911de
我们需要将EJB模块打包成两个使用不同数据库的EAR。对我们来说,最好的方法是将persistence.xml放在EAR中。 - Evandro Pomatti
2个回答

4

由于我的回答是基于其他人的回复,如果有帮助到您的话,我不想获得悬赏。 - Cris
使用JPA 2.0并未解决问题。原来我需要在/lib目录下部署一个JAR文件。很快会上传一个答案。 - Evandro Pomatti

3
在EAR的META-INF文件夹下部署persistence.xml不会触发服务器加载持久化单元(至少在WebLogic 10g上不会,即使启用了JPA 2.0)。
持久化单元需要使用JAR文件在/lib下部署。工作结构:
EAR +
    |- lib +
    |      |- entities.jar
    |      \- persistence-unit.jar +
    |                               \- META-INF +
    |                                            \- persistence.xml
    |- ejb-core-module.jar
    \- ejb-business-module.jar

在这个例子中,“persistence-unit.jar” 用于打包 JPA 配置。

现在我可以使用不同的数据源创建另一个 EAR。使用 组合持久化单元 也可以增加此方法的可重用性。

是的...如果您查看提供的第二个解决方案 EAR + |- lib + | |- core-module.jar | - persistence-module.jar + | - META-INF + | - persistence.xml |- ejb1-module.jar - ejb2-module.jar - Cris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接