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

Pad*_*wan 14 jpa persistence.xml eclipselink jpa-2.0

当我的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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这是我的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>
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

我的xml中也有以下内容

<exclude-unlisted-classes>false</exclude-unlisted-classes>
Run Code Online (Sandbox Code Playgroud)

使用的技术: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>
Run Code Online (Sandbox Code Playgroud)

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

更新3:
你是否检查了构建的内容 -Yes,在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.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首先在类路径上,那么它将被拾取而不是战争中的那个或正确目录中的那个. - 不确定你的意思.我的资源/ META-INF中的persistence.xml是我想要的.不确定war文件与它有什么关系?无论哪种方式,它们应该是我想的相同的persistence.xml.

任何帮助深表感谢!!

Chr*_*ris 5

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

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


Gas*_*Gas 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任务进行安装.

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