Spring Boot 2.0+Hibernate MySQL执行Alter Table时语法错误求助
我之前也碰到过一模一样的问题,Spring Boot 2.0升级后Hibernate版本跟着更新(从5.x早期版本升到了5.2+),对数据库名的处理逻辑发生了变化,这才导致了这个语法错误。下面是几个亲测有效的解决办法:
检查并修正Hibernate方言配置
确保你用的是对应MySQL版本的正确方言,比如MySQL 8.x用org.hibernate.dialect.MySQL8Dialect,MySQL 5.x用org.hibernate.dialect.MySQL5InnoDBDialect。避免使用过于宽泛的MySQLDialect,新版本Hibernate对这些旧方言的处理容易出问题。在application.properties里配置:spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect统一数据库名的配置方式
别在数据源URL和Hibernate配置里重复指定数据库名:- 如果你的数据源URL已经包含了数据库名(比如
jdbc:mysql://localhost:3306/testDatabase?useSSL=false),就不要再在实体类的@Table注解里加schema="testDatabase",也不用额外配置hibernate.default_schema。 - 如果你需要显式指定schema,就在
application.properties里添加:
这样Hibernate会用这个schema生成DDL,不会重复拼接数据库名。spring.jpa.properties.hibernate.default_schema=testDatabase
- 如果你的数据源URL已经包含了数据库名(比如
移除实体类中的冗余schema配置
检查所有实体类的@Table注解,如果有类似@Table(name="analyte_definition", schema="testDatabase")的写法,把schema属性删掉。因为数据源已经指向了目标数据库,重复指定会导致Hibernate生成的SQL里同时出现数据库名和表名,违反MySQL语法。临时降级方案(不推荐)
如果上面的方法都没效果,可以尝试降级Hibernate版本到Spring Boot 1.5.x对应的版本(比如Hibernate 5.0.x),在pom.xml里指定依赖版本:<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.0.12.Final</version> </dependency>不过这只是权宜之计,毕竟升级Spring Boot就是为了用新特性,长期来看还是建议用前面的方法解决根源问题。
修改完配置后重启应用,观察Hibernate生成的DDL语句,应该就会变成正确的alter table analyte_definition add column action_level decimal(8,2)了。
内容的提问来源于stack exchange,提问作者Thomas

