Hibernate 异常 UnknownEntityException:Could not resolve root entity

1、概览

本文将带你了解 Hibernate 出现异常 “UnknownEntityException:Could not resolve root entity” 的原因,以及解决办法。

2、理解异常

通常,在 HQL 或 JPQL 查询中解析已知映射实体名称失败时,Hibernate 就会抛出 “UnknownEntityException: Could not resolve root entity” 异常。

简而言之,Hibernate 依赖 JPA 实体来完成对象关系映射的所有工作。因此,它希望查询中指定的实体名称与 @Entity 注解所注解的类名称相匹配。

因此,导致异常的最常见原因之一就是 使用了与有效实体类名称不匹配的名称

3、示例

知道了导致 Hibernate 出现 UnknownEntityException 的原因后,来看看如何在实践中重现这种情况。

首先,创建一个 Person 类,如下:

@Entity
public class Person {
    @Id
    private int id;
    private String firstName;
    private String lastName;

    // 标准 Getter / Setter 方法省略
}

如上,使用 idfirstNamelastName 来定义一个 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、修复异常

如前所述,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、总结

本文介绍了 Hibernate 出现异常 UnknownEntityException: “Could not resolve root entity” 的原因,以及如何解决该异常。


Ref:https://www.baeldung.com/hibernate-unknownentityexception-could-not-resolve-root-entity