1、概览 {#1概览}
本文将带你了解 Hibernate 出现异常 "UnknownEntityException:Could not resolve root entity" 的原因,以及解决办法。
2、理解异常 {#2理解异常}
通常,在 HQL 或 JPQL 查询中解析已知映射实体名称失败时,Hibernate 就会抛出 "UnknownEntityException: Could not resolve root entity" 异常。
简而言之,Hibernate 依赖 JPA 实体来完成对象关系映射的所有工作。因此,它希望查询中指定的实体名称与 @Entity
注解所注解的类名称相匹配。
因此,导致异常的最常见原因之一就是 使用了与有效实体类名称不匹配的名称。
3、示例 {#3示例}
知道了导致 Hibernate 出现 UnknownEntityException
的原因后,来看看如何在实践中重现这种情况。
首先,创建一个 Person
类,如下:
@Entity
public class Person {
@Id
private int id;
private String firstName;
private String lastName;
// 标准 Getter / Setter 方法省略
}
如上,使用 id
、firstName
和 lastName
来定义一个 Person
。
@Entity
注解表示 Person
类是一个 JPA 实体,@Id
表示代表主键的字段。
接下来,我们故意在 HQL 查询中使用错误的实体名称。例如,尝试用 PERSON
代替 Person
作为实体名称来 SELECT 所有 Person
实体:
class UnknownEntityExceptionUnitTest {
private static Session session;
@BeforeAll
static void init() {
session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
}
@AfterAll
static void clear() {
session.close();
}
@Test
void whenUsingUnknownEntity_thenThrowUnknownEntityException() {
assertThatThrownBy(() -> session.createQuery("FROM PERSON", Person.class))
.hasRootCauseInstanceOf(UnknownEntityException.class)
.hasRootCauseMessage("Could not resolve root entity 'PERSON'");
}
}
如你所见,测试用例失败,抛出了异常:UnknownEntityException: Could not resolve root entity because Hibernate doesn't recognize PERSON as a valid JPA entity。
4、修复异常 {#4修复异常}
如前所述,Hibernate 引发 UnknownEntityException
的主要原因是它无法找到具有指定名称的实体。因此,最简单的解决办法就是在 HQL 和 JPQL 查询中使用正确的实体名称。
添加一个新的测试用例,并将错误的名称 PERSON
替换为正确的 Person
:
@Test
void whenUsingCorrectEntity_thenReturnResult() {
Query<Person> query = session.createQuery("FROM Person", Person.class);
assertThat(query.list()).isEmpty();
}
如上所示,测试用例成功执行,没有出现异常,因为这次使用的 Person
是一个有效的实体名称。
5、总结 {#5总结}
本文介绍了 Hibernate 出现异常 UnknownEntityException: "Could not resolve root entity" 的原因,以及如何解决该异常。
Ref:https://www.baeldung.com/hibernate-unknownentityexception-could-not-resolve-root-entity