Spring Boot测试时Hibernate生成DDL含engine=InnoDB致H2语法错误
问题解析与解决方案
1. Hibernate生成engine=InnoDB导致H2语法错误的原因及解决
你的配置同时启用了**schema.sql手动初始化表和Hibernate的DDL自动更新(spring.jpa.hibernate.ddl-auto=update)**,再加上指定了spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect,这会让Hibernate生成MySQL专属的DDL语句——包括追加engine=InnoDB。但H2数据库即使开启MODE=MySQL,也不支持该语法,因此抛出了语法错误。
解决方法(二选一即可):
- 方案一:禁用Hibernate的DDL自动更新
既然已经通过schema.sql定义了表结构,无需Hibernate再修改表,将配置改为:spring.jpa.hibernate.ddl-auto=none - 方案二:切换为H2对应的方言
测试环境使用H2时,改用H2方言避免生成MySQL专属语法:spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
2. 添加FAILURE非空字段后插入失败的原因及解决
你在schema.sql中新增了FAILURE VARCHAR(10) NOT NULL字段,但实体类AusgabeEntity未包含对应属性,且插入接口也未传递该字段值。Hibernate生成的INSERT语句不会包含FAILURE列,导致插入时该字段为NULL,违反了非空约束。
解决方法(根据业务需求选择):
- 方案一:实体类添加对应字段
在AusgabeEntity中新增FAILURE属性,并确保接口接收该参数:
同时修改测试请求,传递@Entity @Table(name = "Ausgaben") data class AusgabeEntity( @Id val id: Timestamp, val amount: Double, val place: String, val datum: LocalDate, val category: String, val failure: String // 新增对应字段 )failure参数:mockMvc.perform(MockMvcRequestBuilders.post("/save?amount=10&place=lidl&category=haushalt&failure=xxx")) - 方案二:给
FAILURE字段设置默认值
如果无需手动赋值,修改schema.sql给字段添加默认值:CREATE TABLE IF NOT EXISTS `Ausgaben` ( ID TIMESTAMP NOT NULL, AMOUNT INT DEFAULT NULL, FAILURE VARCHAR(10) NOT NULL DEFAULT '', -- 添加默认值 PLACE VARCHAR(20) DEFAULT NULL, DATUM DATE DEFAULT NULL, CATEGORY varchar(20) DEFAULT NULL, primary key (ID) ); - 方案三:允许
FAILURE字段为空
如果业务上该字段可以为空,去掉NOT NULL约束:FAILURE VARCHAR(10) DEFAULT NULL,
内容的提问来源于stack exchange,提问作者Heiducken
相关产品推荐
相关产品推荐

