Spring Boot升级至2.7.3后执行DDL时H2数据库报错
Spring Boot 2.7.3升级后Hibernate执行DDL报错(H2数据库)
问题详情
将Spring Boot从2.6.3版本升级至2.7.3版本(H2数据库随Spring Boot同步更新)后,启动应用时Hibernate执行DDL创建表失败,报错信息如下:
GenerationTarget encountered exception accepting command : Error executing DDL "create table appa_attributes (id bigint generated by default as identity, name varchar(255), value varchar(4000), primary key (id))" via JDBC Statement org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table appa_attributes (id bigint generated by default as identity, name varchar(255), value varchar(4000), primary key (id))" via JDBC Statement
应用配置(application.properties)
server.port=8080 spring.mvc.favicon.enabled = false // 该配置在2.7版本已废弃 spring.datasource.url=jdbc:h2:mem:testdb spring.h2.console.enabled=true spring.h2.console.path=/console/ spring.h2.console.settings.web-allow-others=true spring.jpa.hibernate.ddl-auto=create-drop
实体类代码(Attribute.java)
@Entity @Table(name = "appa_attributes") public class Attribute extends AbstractEntity<Long> implements Comparable<Attribute> { @Column(length = 255) private String name; @Column(length = 4000) private String value; // getters and setters }
解决办法
1. 给H2 URL添加兼容模式参数
新版本H2对SQL语法规则做了调整,在JDBC URL中加入兼容模式参数可解决多数语法兼容问题。比如使用旧版兼容模式:
spring.datasource.url=jdbc:h2:mem:testdb;MODE=LEGACY;DB_CLOSE_DELAY=-1
若代码原适配MySQL,也可使用MySQL兼容模式:
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1
2. 指定Hibernate的H2方言
显式指定适配新版H2的方言,避免版本匹配问题,在配置文件中添加:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
3. 确认主键生成策略
报错中的generated by default as identity语法在新版H2中存在兼容风险,检查AbstractEntity的ID字段是否显式指定生成策略:
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
显式指定IDENTITY策略能让Hibernate生成符合新版H2要求的DDL语句。
4. 清理H2残留数据(文件模式适用)
若使用H2文件存储模式,删除旧数据库文件后重启应用,避免旧数据结构干扰新DDL执行;内存模式只需重启应用即可清空数据。
内容的提问来源于stack exchange,提问作者jadhamterra
相关产品推荐
相关产品推荐

