在整合 Spring MVC + Hibernate 4.1.8 + MySQL 5.1 專案時,啟動自動建表(hbm2ddl.auto=create/update)拋出語法錯誤:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'type=InnoDB' at line 8
TYPE=InnoDB 指定儲存引擎ENGINE=InnoDBorg.hibernate.dialect.MySQLInnoDBDialect 內部硬編碼產生 TYPE=InnoDB修改 Hibernate 配置檔(hibernate.cfg.xml 或 persistence.xml 或 Spring LocalSessionFactoryBean):
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
或 Spring Boot application.yml:
spring:
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
hibernate:
ddl-auto: update
| MySQL 版本 | 儲存引擎 | 推薦方言類別 |
|---|---|---|
| 5.0 及以下 | InnoDB | MySQLInnoDBDialect |
| 5.1 ~ 5.6 | InnoDB | MySQL5InnoDBDialect |
| 5.7+ | InnoDB | MySQL57InnoDBDialect |
| 8.0+ | InnoDB | MySQL8Dialect (繼承 MySQL57InnoDBDialect) |
MySQLDialect:預設 MyISAM,不支援交易MySQLInnoDBDialect:InnoDB 但產生舊語法 TYPE=MySQL5InnoDBDialect:InnoDB + ENGINE= + 更好的索引/鎖支援MySQL57InnoDBDialect:支援 JSON、Generated Columns、CTE 等 5.7 新特性SELECT VERSION();)hbm2ddl.auto 行為ENGINE=InnoDB(SHOW TABLE STATUS)TYPE=InnoDB 元資料,執行 ALTER TABLE t ENGINE=InnoDB 重建方言配置雖小,卻是 ORM 與資料庫版本兼容的關鍵樞紐。版本升級時,同步檢查方言類別應列入標準發布清單。