EclipseLink:未加载实体

Jan*_*nik 1 java jpa eclipselink jpa-2.2

我有一个 JPA 项目,我正在尝试将其更新到 JPA 2.2.0 和 EclipseLink 5.7.1,因为我遇到了EclipseLink 的错误 429992。使用新版本后,我无法再执行我的应用程序 \xe2\x80\x93\xc2\xa0EclipseLink 抛出类似于以下内容的异常(下面示例的简短变体):

\n\n
[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\n[...]\n\nException in thread "main" java.lang.IllegalArgumentException: Object: Artifact@17d919b6 is not a known Entity type.\n    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4324)\n    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:593)\n    at Main.main(Main.java:12)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n\n

你能重现这个错误吗?

\n\n

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

\n\n

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

\n\n

感谢您的任何提示或评论!

\n\n
\n\n

main主类中的方法:

\n\n
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("Example");\nEntityManager entityManager = entityManagerFactory.createEntityManager();\n\nentityManager.getTransaction().begin();\nArtifact artifact = new Artifact();\nentityManager.persist(artifact);\nentityManager.getTransaction().commit();\n\nentityManager.close();\nentityManagerFactory.close();\n
Run Code Online (Sandbox Code Playgroud)\n\n

实体Artifact

\n\n
import javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.GenerationType;\nimport javax.persistence.Id;\nimport javax.persistence.NamedQuery;\n\n@Entity\n@NamedQuery(name = "Artifact.findAll", query = "SELECT a FROM Artifact a")\npublic class Artifact {\n    private int id;\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    public int getId() {\n        return this.id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

持久性.xml:

\n\n
<?xml version="1.0" encoding="UTF-8"?>\n<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">\n    <persistence-unit name="Example">\n        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>\n        <class>Artifact</class>\n\n        <properties>\n            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>\n            <property name="javax.persistence.jdbc.url" value="jdbc:h2:./inventory;create=true"/>\n            <property name="javax.persistence.jdbc.user" value="APP"/>\n            <property name="javax.persistence.jdbc.password" value="APP"/>\n            <property name="eclipselink.logging.level" value="FINEST"/>            \n            <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>\n            <property name="eclipselink.ddl-generation.output-mode" value="database"/>\n        </properties>\n    </persistence-unit>\n</persistence>\n
Run Code Online (Sandbox Code Playgroud)\n\n

pom.xml 用于 Maven 依赖项:

\n\n
<project xmlns="http://maven.apache.org/POM/4.0.0"\n    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">\n    <modelVersion>4.0.0</modelVersion>\n    <groupId>JPATest</groupId>\n    <artifactId>JPATest</artifactId>\n    <version>0.0.1-SNAPSHOT</version>\n    <build>\n        <sourceDirectory>src</sourceDirectory>\n        <plugins>\n            <plugin>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.7.0</version>\n                <configuration>\n                    <release>10</release>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n    <dependencies>\n        <!-- https://mvnrepository.com/artifact/org.eclipse.persistence/javax.persistence -->\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>javax.persistence</artifactId>\n            <version>2.2.0</version>\n        </dependency>\n\n        <!-- https://mvnrepository.com/artifact/org.eclipse.persistence/eclipselink -->\n        <dependency>\n            <groupId>org.eclipse.persistence</groupId>\n            <artifactId>eclipselink</artifactId>\n            <version>2.7.1</version>\n        </dependency>\n\n        <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->\n        <dependency>\n            <groupId>com.h2database</groupId>\n            <artifactId>h2</artifactId>\n            <version>1.4.197</version>\n        </dependency>\n    </dependencies>\n</project>\n
Run Code Online (Sandbox Code Playgroud)\n

afs*_*har 5

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

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

     <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>eclipselink</artifactId>
        <version>2.7.1</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

 <version>2.7.5</version>
Run Code Online (Sandbox Code Playgroud)

更新之前,实体未加载并且 em.getMetamodel() 为空。更新后,我的所有实体均已成功加载

可以从此链接访问问题和已修复的错误。