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

H2数据库报错‘Domain 'int' not found’的兼容解决方案咨询

问题原因

错误org.h2.jdbc.JdbcSQLSyntaxErrorException: Domain 'int' not found的根源在于:你把Java Boolean类型的字段指定了columnDefinition = "int",H2数据库解析时错误将小写的int识别为自定义域(Domain)而非内置数据类型,同时布尔类型与SQL INT类型的映射本身不匹配,导致语法错误。

H2数据库的正确定义方式

针对用整数存储布尔值的需求,有两种可行方案:

方案1:依赖JPA自动映射(推荐)

直接移除columnDefinition,让JPA自动处理类型映射。H2会把Boolean字段映射为内置的BOOLEAN类型,底层实际以1/0存储true/false,完全符合需求:

@Column(name = "trust", nullable = false)
private Boolean trust;

方案2:显式指定内置整数类型

如果必须手动指定字段类型,要使用大写的INT(避免被误判为自定义域),JPA会自动完成Boolean到INT的转换:

@Column(name = "trust", nullable = false, columnDefinition = "INT")
private Boolean trust;
与MariaDB的兼容性建议

要同时兼容H2和MariaDB,遵循以下原则:

  • 优先用JPA标准映射,避免硬编码columnDefinition
    去掉columnDefinition后,JPA会根据数据库自动适配:MariaDB将Boolean映射为标准的TINYINT(1)(这是MariaDB存储布尔值的常规方式),H2则映射为BOOLEAN,两者都能正确用1/0表示布尔值,无需额外配置。

  • 必须指定columnDefinition时用跨库兼容写法
    直接使用两者都支持的TINYINT(1),既符合MariaDB的布尔存储规范,H2也能正确识别并映射为Boolean类型:

    @Column(name = "trust", nullable = false, columnDefinition = "TINYINT(1)")
    private Boolean trust;
    
  • 开启H2的MariaDB兼容模式
    在H2连接URL中添加MODE=MariaDB,让H2模拟MariaDB的语法和类型处理逻辑,进一步减少兼容性差异:

    jdbc:h2:mem:testdb;MODE=MariaDB;DB_CLOSE_DELAY=-1
    

内容的提问来源于stack exchange,提问作者Shuvo Kumar Sarkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 12:55:56