使用Hibernate插入数据库对象时报org.hibernate.MappingException错误求助
Hibernate MappingException 问题修复
报错根因
程序抛出org.hibernate.MappingException的核心原因是:Person类没有添加必要的实体映射注解,Hibernate无法识别其作为数据库映射对象的规则。
你当前的Person类只是普通POJO,哪怕在配置文件里声明了类路径、在代码中调用了addAnnotatedClass,Hibernate也不知道如何将类字段和数据库表列对应,自然会抛出映射异常。
分步修复方案
1. 补全Person类的核心映射注解
需要给类和主键字段添加JPA标准注解,Hibernate才能正确识别映射规则,修复后的代码如下:
package com.mihir.hibDemo; // 导包说明:Hibernate 5.x版本用javax.persistence下的注解,Hibernate 6.x及以上用jakarta.persistence下的注解,请勿导错包 import jakarta.persistence.Entity; import jakarta.persistence.Id; @Entity // 标记当前类为需要映射到数据库表的实体类 public class Person { @Id // 标记id字段为对应数据库表的主键 private int id; private String name; // 原有getter、setter方法保持不变 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
注意:如果导错了非JPA标准的包路径下的注解,Hibernate依然会识别失败,重复抛出MappingException。
2. 调整配置文件的版本兼容项
你当前的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"> <hibernate-configuration> <session-factory> <!-- MySQL 8.x版本的驱动类名需要替换为cj包路径,仅MySQL 5.x版本可使用原com.mysql.jdbc.Driver --> <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="hibernate.connection.password">0924</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/college</property> <property name="hibernate.connection.username">root</property> <!-- MySQL 8.x需要适配对应版本方言,旧版MySQL可沿用原MySQLDialect --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property> <property name="hibernate.hbm2ddl.auto">create</property> <!-- 实体加载配置二选一即可,无需重复配置 --> <mapping class="com.mihir.hibDemo.Person"/> </session-factory> </hibernate-configuration>
补充提示:当前配置中
hibernate.hbm2ddl.auto设置为create,每次程序运行都会删除原有Person表并重建,正式测试时可以改为update,避免已有数据被清空。
3. 冗余配置说明
你在App.java中写的addAnnotatedClass(Person.class)和xml中的<mapping>标签作用完全一致,只要保留其中一种实体加载方式即可,重复配置不会报错,但属于无意义冗余。
错误截图参考

内容的提问来源于stack exchange,提问作者Mihir Sheth
相关产品推荐
相关产品推荐

