You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

org.hibernate.UnknownEntityTypeException求助:Hibernate无法识别Person实体

解决org.hibernate.UnknownEntityTypeException:无法定位实体描述符的问题

问题根源分析

核心问题是Spring Boot 3与Hibernate版本不兼容,搭配注解包和配置方式的冲突导致实体无法被识别:

  1. Spring Boot 3.0.x基于Jakarta EE 9,要求使用适配Jakarta的Hibernate 6.x版本,但你手动引入的Hibernate 5.6.4仍依赖javax.persistence包,和Jakarta环境不兼容。
  2. 混合使用原生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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:07:08