Hibernate報錯CommandAcceptanceException: Error executing DDL “create table

Jun
appxtech
Published in
3 min readSep 2, 2020

錯誤console:org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL “create table

1) 解決方式

2) 造成原因

解決方式

使用舊版的DB或更換hibernate.dialect

更換hibernate.cfg.xml中的SQL語法工具<property name=”hibernate.dialect”>    org.hibernate.dialect.MySQLDialect ← ← ←換成其他版本</property>

在Hibernate5.4版中,所有的MySQLDialect版本如下
在類別路徑org.hibernate.dialect中的dialect

MySQL55Dialect.class
MySQL57Dialect.class
MySQL57InnoDBDialect.class
MySQL5Dialect.class
MySQL5InnoDBDialect.class
MySQL8Dialect.class
MySQLDialect.class ← ← ←舊版

除了MySQLDialect.class舊版外,其他都可以正常執行,解決CommandAcceptanceException: Error executing DDL “create table的問題。

造成原因

1)當更換(升級)DB的版本時
2)Hibernate的映對關係使用一對多(one 2 many)

問題點在create table時發生的SQL語句錯誤

原先在hibernate.dialect使用MySQLDialect時,因為對應是舊版的DB,因此在生成table時是正常的。但當上述的狀況1,在DB更換或升級時,原有的MySQLDialect.class在使用SQL語句時,其create table會發生錯誤。

經過實際測試發現,即使在DB更換或升級後,使用MySQLDialect.class雖然不會出現錯誤,但當發生狀況2,在使用映對一對多(one 2 many)關係且建立table時,就會發生錯誤,但若是table(資料表)已經存在時,新版DB使用MySQLDialect.class是不會有問題的。

爬文其他經驗的分享者後得知,MySQLDialect.class與其他本版在create table(建立資料表)時,最主要的不同在於使用Hibernate於建立資料表時,新版的MySQLDialect會在生成的SQL語句後加上“ENGINE-InnoDB”。這時候在使用新版DB(實際測是使用MySQL8版),才能正常create table(創建資料表)。

--

--