14

当谈到我的 persistence.xml 文件的位置时,我感到很困惑。我使用 eclipselink 2.4 作为我的 JPA 2.0 实现,并且我的 persistence.xml 位于 src/main/resources/META-INF/persistence.xml 下,与许多帖子状态一样。

第一个问题:在 Eclipse 中发布到我的服务器后,我收到一条错误消息,指出我的 persistence.xml 未找到。

Exception: : java.lang.IllegalArgumentException: No persistence unit named 'X'
is available in scope Webapp. Available persistence units: [] at

在此处输入图像描述

这是我的 persistence.xml 的代码

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="X" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>localJTA</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
    <property name="eclipselink.target-server" value="WebLogic"/>
    <property name="eclipselink.logging.level" value="FINEST"/>          
</properties>
</persistence-unit>
</persistence>

如果我将 META-INF 移动到 webapp/WEB-INF/classes/META-INF 那么它可以工作!我无法理解问题所在。

在此处输入图像描述

我检查了项目构建路径,那里的一切看起来都很好。

在此处输入图像描述

我遇到的第二个问题是我的带注释的实体类没有被 eclipselink 自动拾取。在我的 JPA 配置中,我自动选择了发现带注释的类。

在此处输入图像描述

我的xml中也有以下内容

<exclude-unlisted-classes>false</exclude-unlisted-classes>

使用的技术:weblogic 12c 服务器、EJB 3.1、JPA 2.0、M2E-WTP 和 JSF 2.1

更新1:将META-INF留在路径src/main/resources/META-INF/persistence.xml并执行maven install构建war文件,META-INF文件夹正确放置在WEB-INF/classes/META- INF/persistence.xml 应该是(在战争中)。似乎这只是 webapp 在 Eclipse 中本地构建和运行的问题。谁能解释一下?

更新 2:将 META-INF 留在 src/main/resources 中,即 src/main/resources/META-INF/persistence.xml 和我的 persistence.xml 中的以下内容,而不是显式列出实体类

<exclude-unlisted-classes>false</exclude-unlisted-classes>

如果我构建战争并通过 Internet Explorer 通过 weblogic 控制台部署它,则可以工作。为什么它在日食内部不起作用!?

更新 3:
您是否检查了构建的内容- 是的,在 Eclipse 中,我已将构建设置为自动。在项目文件夹中查看 java 包 com、包含 persistence.xml 的 META-INF 文件夹和位于 Webapp/target/classes 下的资源文件夹。
如果战争是相同的- 您指的是 C:\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\Weblogic12cDomain_auto_generated_ear_\Webapp.war 中的 Webapp.war 文件夹吗?如果是这样,那里唯一的东西是 WEB-INF\lib\jsf-impl-2.1.7.jar
那么您是否检查了用于在 Eclipse 中测试您的应用程序的类路径 - 如预期在 Webapp/ 下可以在我的类路径中找到此条目.classpath
如果资源目录中的persistence.xml首先在类路径上,它将被拾取而不是你战争中的那个或正确目录中的一个- 我的理解是Eclipse将构建项目,然后将内容复制到服务器不生成战争文件。

这是 maven 生成的 Webapp.war 的根目录:

在此处输入图像描述

以下是 Webapp 项目文件夹的根目录:

在此处输入图像描述

这是 C:\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\Weblogic12cDomain_auto_generated_ear_\Webapp.war 下 Webapp.war 文件夹的根目录

在此处输入图像描述

如果资源目录中的persistence.xml首先在类路径上,它将被拾取而不是你的war中的一个或正确目录中的一个。- 不知道你的意思。我的资源/META-INF 中的 persistence.xml 是我想要获取的。不确定战争文件与它有什么关系?无论哪种方式,它们都应该是我认为的相同的 persistence.xml。

任何帮助深表感谢!!

4

4 回答 4

5

我相信您在这里至少有两个问题。

1) Maven 构建

您的项目具有 maven 结构而不是 Eclipse Web 项目结构,因此必须使用 maven 命令构建它,而不是默认使用 Eclipse 构建。(我不是 maven 专家,所以如果不是真的,请 maven 专家加入并发表评论)。因此,当您在 Eclipse 中进行自动构建时,它不知道应该将您的 src/main/resources/META-INF/persistence.xml 复制到 WEB-INF/classes/META-INF/persistence.xml 并编译 java类。

2) 部署

如果您遵循 Eclipse 项目结构,那么当您选择“添加到服务器”时,Eclipse 知道如何打包并将您的项目添加到服务器。如果您使用的是 maven,那么您构建的战争通常位于目标目录中。因此,您需要再次导出此战争并使用 WebLogic 工具安装它,或者通过 maven 任务安装它。

检查WebLogic Server with Maven and Eclipse Oracle 如何建议将 Eclipse 与 WebLogic 和 Maven 一起使用

于 2014-07-03T22:35:14.503 回答
5

JPA 规范的第 8.2.1 节指出“persistence.xml 文件位于持久性单元根目录的 META-INF 目录中”。以及后来的“托管持久性类可以包含在持久性单元的根中;或者它们可以通过引用来指定——即,通过命名类、类档案或 XML 映射文件(它们反过来引用类)可在应用程序类路径上访问”

所以持久化单元的根目录就是 META-INF 目录所在的位置。通过将类放在类目录中,它们不在持久单元的根目录中,因此必须明确命名才能包含在内。

于 2013-06-13T13:24:59.117 回答
2

你从来没有提到过 maven,所以我不知道这是否在你的盘子里;在我添加 hibernate-entitymanager 依赖项之前,它不适用于 maven。我的 pom.xml 只有hibernate-core。在我添加了 hibernate-entitymanager 之后,它开始工作(用于我的测试)。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.3.1.Final</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.1.Final</version>
</dependency>
于 2014-02-25T21:03:34.237 回答
0

检查persistence.xml 是否在您的战争中。或者它不是,或者它只是在错误的位置。您也可以将此文件放在 java/main/resources 文件夹中,以便将其放置在您的类路径中

于 2014-07-03T21:38:06.597 回答