如何排查Hibernate 5.6.4搭配MySQL 8.0.29时的SQL语法错误
解决Hibernate保存Student时表不存在的异常
你的问题核心是Hibernate没有自动创建student表,根源在hibernate.cfg.xml里的几处配置错误,加上方言不匹配导致DDL生成失效。以下是具体修复步骤:
1. 修正MySQL方言配置
你使用的是MySQL 8.0.29,但配置里用了MySQL5Dialect,这会导致Hibernate生成的DDL语法不兼容MySQL8,无法正确创建表。把方言改成:
<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
2. 修复show_sql的配置值
show_sql的取值只能是true或false,你写成了update,属于无效配置,会干扰Hibernate初始化逻辑,导致hbm2ddl.auto=update不生效。修正为:
<property name="show_sql">true</property>
3. 确认数据库已创建
hbm2ddl.auto=update只会自动创建表,不会创建数据库。先手动登录MySQL执行以下命令确保hibernatedb存在:
CREATE DATABASE IF NOT EXISTS hibernatedb;
4. 可选:强制创建表(临时方案)
如果以上步骤改完仍不生效,可以临时把hibernate.hbm2ddl.auto改成create,运行一次程序后再改回update,强制Hibernate重建表:
<property name="hibernate.hbm2ddl.auto">create</property>
修正后的完整hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver.class">com.mysql.cj.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatedb</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">mysql@123</property> <property name="dialect">org.hibernate.dialect.MySQL8Dialect</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="show_sql">true</property> </session-factory> </hibernate-configuration>
改完这些配置后重新运行程序,Hibernate会自动创建student表,保存操作即可正常执行。
内容的提问来源于stack exchange,提问作者Suryamani Pandey
相关产品推荐
相关产品推荐

