org.hibernate.UnknownEntityTypeException求助:Hibernate无法识别Person实体
解决org.hibernate.UnknownEntityTypeException:无法定位实体描述符的问题
问题根源分析
核心问题是Spring Boot 3与Hibernate版本不兼容,搭配注解包和配置方式的冲突导致实体无法被识别:
- Spring Boot 3.0.x基于Jakarta EE 9,要求使用适配Jakarta的Hibernate 6.x版本,但你手动引入的Hibernate 5.6.4仍依赖
javax.persistence包,和Jakarta环境不兼容。 - 混合使用原生Hibernate的
Configuration构建逻辑与Spring Boot环境,无法触发Spring的实体扫描机制。
分步解决方案
1. 修正Maven依赖
移除手动添加的hibernate-core依赖,spring-boot-starter-data-jpa已包含适配Spring Boot 3的Hibernate 6.x版本,避免版本冲突:
<!-- 删除这段手动引入的Hibernate依赖 --> <!-- <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.4.Final</version> </dependency> -->
2. 更新实体类的注解包
将实体类中javax.persistence的导入替换为Jakarta EE的jakarta.persistence包,这是Spring Boot 3+的强制要求:
// Person.java 修正后的导入 import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; @Entity @Table(name = "Person") public class Person { // 原有属性、构造方法、getter/setter保持不变 }
3. 改用Spring Boot标准方式操作Session
放弃原生Hibernate的Configuration构建逻辑,使用Spring Boot提供的EntityManager获取Session,确保Spring上下文正确加载实体:
package com.example.test; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class TestApplication implements CommandLineRunner { @PersistenceContext private EntityManager entityManager; public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } @Override public void run(String... args) throws Exception { var session = entityManager.unwrap(org.hibernate.Session.class); session.beginTransaction(); Person person = session.get(Person.class, 1); System.out.println(person.getName()); System.out.println(person.getAge()); session.getTransaction().commit(); } }
4. 切换到Spring Boot标准配置文件
删除hibernate.cfg.xml和hibernate.properties,在src/main/resources下创建application.properties统一配置:
# 数据库连接配置 spring.datasource.url=jdbc:postgresql://localhost:5432/postgres spring.datasource.username=postgres spring.datasource.password=postgres # JPA/Hibernate配置 spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
额外检查点
- 确认
Person类所在包在Spring Boot扫描范围内(@SpringBootApplication注解在com.example.test包下,默认会扫描该包及其子包)。 - 检查PostgreSQL服务是否正常运行,目标数据库
postgres已创建,账号密码正确。
内容的提问来源于stack exchange,提问作者anna
相关产品推荐
相关产品推荐

