JPA persistence.xml META-INF无法正常工作

时间:2013-06-13 02:52:00

标签: jpa jpa-2.0 eclipselink persistence.xml

当涉及到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

enter image description here

以下是我的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,那么它可以工作!我无法理解问题所在。

enter image description here

我检查了项目构建路径,一切看起来都不错。

enter image description here

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

enter image description here

我的xml中还有以下内容

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

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

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

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

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

工作如果我构建战争并通过weblogic控制台通过Internet Explorer部署它。为什么它不在eclipse里面工作!?

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

以下是maven生成的Webapp.war的根源:

enter image description here

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

enter image description here

以下是C:\ workspace.metadata.plugins \ org.eclipse.wst.server.core \ tmp0 \ Weblogic12cDomain_auto_generated_ear_ \ Webapp.war

下Webapp.war FOLDER的根目录

enter image description here

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

任何帮助都非常感谢!!

4 个答案:

答案 0 :(得分:5)

JPA规范的8.2.1节说明“persistence.xml文件位于 持久性单元根的META-INF目录。“以后”管理持久性类可以包含在持久性单元的根目录中;或者他们 可以通过引用来指定,即通过命名类,类存档或XML映射文件 (在应用程序类路径“

上可访问的(反过来引用类)

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

答案 1 :(得分:5)

我相信你至少有2个问题。

1)Maven构建

您的项目具有maven结构而不是Eclipse Web项目结构,因此必须使用maven命令构建,而不是默认情况下使用Eclipse构建。 (我不是专家,所以请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一起使用

答案 2 :(得分: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>

答案 3 :(得分:0)

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