解決方式
使用舊版的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(創建資料表)。