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

使用Hibernate保存Person实体报错:Unknown entity: org.example.Person

问题:Hibernate保存Person实体时抛出MappingException

执行保存操作时出现错误:org.hibernate.MappingException: Unknown entity: org.example.Person

相关代码

Person类

package org.example;

import lombok.Data;

@Data
public class Person {
    private int id;
    private String firstName;
    private String lastName;
    private int age;

    public Person(int id, String firstName, String lastName, int age) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
}

Person.hbm.xml

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name = "org.example.Person" table = "person">
        
        <id name = "id" type = "int" column = "id">
            <generator class="native"/>
        </id>

        <property name = "firstName" column = "firstname" type = "string"/>
        <property name = "lastName" column = "lastname" type = "string"/>
        <property name = "age" column = "age" type = "int"/>

    </class>
</hibernate-mapping>

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Version 8 MySQL hiberante-cfg.xml example for Hibernate 5 -->
<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hbm</property>
        <property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
        <property name="connection.username">root</property>
        <property name="connection.password">1234</property>
        <property name="connection.pool_size">3</property>
        <!--property name="dialect">org.hibernate.dialect.MySQLDialect</property-->
        <property name="current_session_context_class">thread</property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
<!--         <mapping resource="Person.hbm.xml" />-->
        <mapping class="org.example.Person"/>
    </session-factory>
</hibernate-configuration>

HibernateUtil.java

package org.example;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static SessionFactory sessionFactory = null;

    static {
        Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .applySettings(cfg.getProperties());
        sessionFactory = cfg.buildSessionFactory(builder.build());
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

Main.java

package org.example;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;


public class Main {
    public static void main(String[] args) {
        SessionFactory factory = HibernateUtil.getSessionFactory();
        Session session = factory.openSession();
        Transaction tx = session.getTransaction();
        try{
            tx.begin();
            Person p = new Person(1,"John","Doe",23);
            session.save(p);
            tx.commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            session.close();
        }
    }
}

错误原因及解决方案

原因

你混淆了Hibernate的两种实体映射方式:

  1. 编写了XML映射文件Person.hbm.xml,但在配置文件中注释掉了对应的<mapping resource>配置;
  2. 使用了<mapping class="org.example.Person"/>,但Person类未添加Hibernate/JPA的实体注解(如@Entity、@Id),导致Hibernate无法识别它为实体类。

解决方案

两种方案二选一即可:

方案1:使用XML映射文件

修改hibernate.cfg.xml,注释掉<mapping class>并启用XML映射配置:

<!-- <mapping class="org.example.Person"/> -->
<mapping resource="Person.hbm.xml" />

注意:确保Person.hbm.xml放在类路径下(如Maven项目的src/main/resources目录),否则Hibernate无法找到该文件。

方案2:使用注解映射

  1. 在Person类上添加JPA注解:
package org.example;

import lombok.Data;
import lombok.NoArgsConstructor;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;

@Data
@NoArgsConstructor
@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String firstName;
    private String lastName;
    private int age;

    public Person(int id, String firstName, String lastName, int age) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }
}
  1. 保留hibernate.cfg.xml中的<mapping class="org.example.Person"/>,可删除Person.hbm.xml文件。

补充:使用注解时必须添加无参构造函数,Lombok的@NoArgsConstructor可自动生成该构造函数,Hibernate需要通过它实例化实体对象。

内容的提问来源于stack exchange,提问作者mohsen_true

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:35:55