【问题标题】:EclipseLink: Entities not loadedEclipseLink:未加载实体
【发布时间】:2018-06-20 21:21:30
【问题描述】:

我有一个 JPA 项目,我正在尝试将其更新到 JPA 2.2.0 和 EclipseLink 5.7.1,因为我遇到了bug 429992 of EclipseLink。有了新版本,我就无法再执行我的应用程序了——EclipseLink 会引发类似于以下的异常(下面我的示例中的短变体):

[EL Warning]: metamodel: 2018-06-20 22:38:14.1--Thread(Thread[main,5,main])--The collection of metamodel types is empty. Model classes may not have been found during entity search for Java SE and some Java EE container managed persistence units.  Please verify that your entity classes are referenced in persistence.xml using either <class> elements or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element
[...]

Exception in thread "main" java.lang.IllegalArgumentException: Object: Artifact@17d919b6 is not a known Entity type.
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4324)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:593)
    at Main.main(Main.java:12)

在更新之前,一切正常(除了前面提到的错误),而且如果我签出较早的提交,也没有问题。

我已经用下面附加的最小设置重现了这种行为。

该项目是使用 Java SE 10 编译的,作为 IDE,我使用的是 Eclipse,但在我的项目属性中,我只能选择“Generic 2.1”作为 JPA-Platform。这可能是个问题吗?

你能重现这个错误吗?

据我所见,Entity-class 列在persistence.xml 中,并且还使用@Entity 进行了注释,但EclipseLink 并未加载该实体类。清理项目甚至创建一个新项目都不能解决问题。

你有什么想法,我的错误可能是什么?我是否遗漏了有关使用 JPA 2.2/EclipseLink 2.7.1 的任何基本要点?

感谢您的任何提示或cmets!


主类中的main方法:

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("Example");
EntityManager entityManager = entityManagerFactory.createEntityManager();

entityManager.getTransaction().begin();
Artifact artifact = new Artifact();
entityManager.persist(artifact);
entityManager.getTransaction().commit();

entityManager.close();
entityManagerFactory.close();

实体Artifact

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;

@Entity
@NamedQuery(name = "Artifact.findAll", query = "SELECT a FROM Artifact a")
public class Artifact {
    private int id;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="Example">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>Artifact</class>

        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:./inventory;create=true"/>
            <property name="javax.persistence.jdbc.user" value="APP"/>
            <property name="javax.persistence.jdbc.password" value="APP"/>
            <property name="eclipselink.logging.level" value="FINEST"/>            
            <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
            <property name="eclipselink.ddl-generation.output-mode" value="database"/>
        </properties>
    </persistence-unit>
</persistence>

用于 Maven 依赖项的 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>JPATest</groupId>
    <artifactId>JPATest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <release>10</release>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.eclipse.persistence/javax.persistence -->
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.2.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.eclipse.persistence/eclipselink -->
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.7.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.197</version>
        </dependency>
    </dependencies>
</project>

【问题讨论】:

  • 您的日志(如果您还没有的话,将 EclipseLink 日志设置为最好)是否显示它正在加载 Artifact 实体类?它应该直接说明它,因为您在持久性单元中提到了它。如果没有,请确保您的包名称在 persistence.xml 中正确。如果确实提到它已加载,请检查用于加载 EMF/EM 的类加载器是否与用于应用程序 Artifact 实例的类加载器匹配。您看到的警告可以忽略:eclipse.org/forums/index.php/t/365263
  • ` Artifact` 你尝试过长(合格)类名吗?
  • 感谢你们到目前为止的cmets!
  • @JacekCz:在我的示例中,它是限定名称,但即使在给出全名的包中它也不起作用。
  • @Chris:日志根本没有显示有关该实体的任何其他条目。这就是我感到困惑的原因。包名和类名都正确,Eclipse 也可以重构。我已包含警告,因为它指出“[...] 在实体搜索期间可能未找到模型类 [...]”。

标签: java jpa eclipselink jpa-2.2


【解决方案1】:

我也有同样的问题。最后,通过更新 pom.xml 解决了这个问题。

Eclipselink 2.7.1 版本有一些错误已在较新版本中修复。

     <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>eclipselink</artifactId>
        <version>2.7.1</version>
    </dependency>

 <version>2.7.5</version>

在更新之前,实体没有加载并且 em.getMetamodel() 是空的。 更新后,我所有的实体都加载成功了

问题和修复的错误可以从this link访问。

【讨论】:

    【解决方案2】:

    我有几乎相同的环境并遇到相同的问题。我几乎不敢说,但在 Eclipse 中,“项目/maven/更新项目......”有帮助(到目前为止)。

    【讨论】:

    • 所以这是一个引用 Eclipse IDE 的答案,它甚至没有这么说。它也没有说明为什么这将有助于解决 eclipselink 问题。例如。请说明 Eclipse IDE 将在后台为您做什么,以及如何在命令行上执行此操作。
    • 嗯,Janik 显然使用了 eclipse、maven 和 eclipselink,所以我和我清楚地这么说。就我而言,“project/maven/update”解决了这个问题。同时(由于其他原因)我切换到休眠作为 orm 提供者,所以我不能再重现这个设置了。很抱歉我的提示没有帮助。而且我没有(想)检查“背景”中发生了什么。如果您还没有这样做,请考虑尝试一下;)
    • "显然使用了 eclipse"——是的,但是如果他使用的是 maven,maven 将生成可重现的构建。始终首先使用构建工具并使其在那里工作。
    猜你喜欢
    • 2023-03-20
    • 2016-03-28
    • 2017-07-06
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多