使用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的两种实体映射方式:
- 编写了XML映射文件
Person.hbm.xml,但在配置文件中注释掉了对应的<mapping resource>配置; - 使用了
<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:使用注解映射
- 在
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; } }
- 保留
hibernate.cfg.xml中的<mapping class="org.example.Person"/>,可删除Person.hbm.xml文件。
补充:使用注解时必须添加无参构造函数,Lombok的@NoArgsConstructor可自动生成该构造函数,Hibernate需要通过它实例化实体对象。
内容的提问来源于stack exchange,提问作者mohsen_true
相关产品推荐
相关产品推荐

