必须使用org.hibernate.dialect.mysql8dialect,hibernate≥5.3,驱动类为com.mysql.cj.jdbc.driver,jdbc url需含servertimezone和allowpublickeyretrieval,json字段需配合@type与类型贡献者。

MySQL 8.0 必须用 org.hibernate.dialect.MySQL8Dialect
用错方言会导致启动报错或 SQL 生成异常,比如 hibernate.cfg.xml 里写成 MySQL57Dialect 或旧版 MySQLDialect,Hibernate 会把 JSON 字段当普通字符串、utf8mb4 排序规则识别失败,甚至生成带 TYPE=InnoDB 的废弃语法。
MySQL 8.0 默认启用 caching_sha2_password 认证、默认字符集是 utf8mb4_0900_ai_ci,只有 MySQL8Dialect 才原生支持这些特性。
- 确认 Hibernate 版本 ≥ 5.3(5.2 及更早不包含该 dialect)
- 在
hibernate.cfg.xml中显式指定:<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
- 不要依赖自动探测——Hibernate 仅根据 JDBC URL 大致判断,容易误判为 5.x
URL 里加 serverTimezone 和 allowPublicKeyRetrieval
MySQL 8.0 驱动(mysql-connector-java ≥ 8.0)默认拒绝不安全的连接参数,不加这两个配置,常见报错是:The server time zone value 'XXX' is unrecognized 或 Public Key Retrieval is not allowed。
这不是 Hibernate 的问题,但和方言配合失效直接相关:时区错乱会让 @Temporal 时间字段存取偏移,公钥检索禁用则根本连不上库,方言压根没机会生效。
- JDBC URL 示例:
jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false
-
serverTimezone必须用 IANA 时区名(如Asia/Shanghai),不能写CST或+08:00 -
allowPublicKeyRetrieval=true是临时方案;生产环境应配好 MySQL 用户的密码插件并用密钥对认证
hibernate.cfg.xml 中别漏掉 hibernate.connection.driver_class
很多老项目沿用 com.mysql.jdbc.Driver,但 MySQL 8.0 驱动已废弃该类,改用 com.mysql.cj.jdbc.Driver。漏配或配错会导致 ClassNotFoundException,方言根本加载不到。
Hibernate 5.3+ 要求驱动类名必须显式声明,否则即使 URL 正确,也会 fallback 到空驱动或报 No suitable driver。
- 务必写全新类名:
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
- 对应 Maven 依赖必须是
mysql:mysql-connector-java:8.0.x,不是mysql-connector-java:5.1.x - 如果用 Spring Boot,此项可由
spring.datasource.driver-class-name控制,但纯 XML 配置下不可省
JSON 字段映射要搭配 @Type(type = "json") 和自定义序列化器
MySQL8Dialect 支持 JSON 类型,但 Hibernate 默认不识别 JSON 列——它只负责生成 JSON 类型的 DDL 和适配函数(如 JSON_EXTRACT),具体 Java 对象 ↔ JSON 字符串转换得自己来。
常见现象是:建表成功,但保存 Map 或自定义对象时报 could not serialize 或字段存成 null。
- 需引入第三方类型支持,例如
hibernate-types-52(对应 Hibernate 5.2+) - 实体中用:
@Type(type = "json")<br/>@Column(columnDefinition = "json")<br/>private Map<String, Object> metadata;
- 必须在
hibernate.cfg.xml中注册类型:<property name="hibernate.types.contributors">com.vladmihalcea.hibernate.type.json.JsonBinaryTypeContributor</property>
没配类型贡献者,@Type 注解会被忽略,字段还是走默认的字符串序列化,数据损坏不易察觉。










