H2数据库报错‘Domain 'int' not found’的兼容解决方案咨询
错误org.h2.jdbc.JdbcSQLSyntaxErrorException: Domain 'int' not found的根源在于:你把Java Boolean类型的字段指定了columnDefinition = "int",H2数据库解析时错误将小写的int识别为自定义域(Domain)而非内置数据类型,同时布尔类型与SQL INT类型的映射本身不匹配,导致语法错误。
针对用整数存储布尔值的需求,有两种可行方案:
方案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;
要同时兼容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

