【发布时间】: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