You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:06:13