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

标签 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 配置中,我自动选择了 Discover 注释类。

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

更新 2:将 META-INF 留在 src/main/resources
即 src/main/resources/META-INF/persistence.xml
以及我的 persistence.xml 中的以下内容,而不是明确列出实体类
<exclude-unlisted-classes>false</exclude-unlisted-classes>

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

更新 3:
你有没有检查 build 的东西 - 是的,在 Eclipse 中,我已将build设置为自动。在项目文件夹中,我看到 java 包 com、包含persistence.xml 的 META-INF 文件夹和 Webapp/target/classes 下的资源文件夹。

如果 war 一样 - 您是指 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 首先在类路径上,它将被拾取而不是在您的war 或正确目录中的那个 - 我的理解是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 文件夹根目录下的内容

enter image description here

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

任何帮助深表感谢!!

最佳答案

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

所以持久化单元的根就是 META-INF 目录所在的目录。通过将类放在 classes 目录中,它们不在持久性单元的根目录中,因此必须显式命名以包含在内。

关于JPA persistence.xml META-INF 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17078412/

相关文章:

java - 如何访问jpa中的多对多表?

java - 卡住 Tomcat 线程。 EclipseLink 乐观锁定

java - JPA 连接在 Eclipse 中工作,但在编译时给出 NullPointerException

java - 如何将 native 数据库运算符 (postgres ~) 与 JPA 条件生成器一起使用?

jpa-2.0 - 在 eclipselink 中执行 UPDATE 而无需 SELECT

java - 如何在一个 JPQL 查询中使用多个 JOIN FETCH

java - Log4j JPA 附加程序

java - JPA:正确保留 ManyToOne 实体

java - JPA by Object 在对象中使用非@Id 的属性

java - 在同一事务中更新两个对象