升级JOOQ与H2后DSL生成实体名称大小写异常问题
问题原因
- jOOQ 版本升级后的默认行为变更:jOOQ 3.11到3.19版本间,代码生成器对数据库标识符大小写的处理逻辑发生调整。旧版本jOOQ会自动将H2元数据中的大写表名转为小写生成到代码中,而新版本默认保留数据库存储的大写标识符。
- H2 标识符存储特性:H2 默认对未加引号的标识符不区分大小写,会自动将SQL脚本中的小写表名转为大写存储到元数据中。你用Flyway小写脚本创建表,H2实际存储的是大写表名,新版本jOOQ直接读取该大写值生成代码。
修复方案
方案1:配置jOOQ代码生成器强制输出小写标识符
在jOOQ代码生成器配置文件(如jooq-codegen.xml)的database节点中添加以下配置,强制生成小写表名:
<database> <!-- 其他已有配置 --> <inputIdentifierCase>AS_IS</inputIdentifierCase> <outputIdentifierCase>LOWER</outputIdentifierCase> </database>
inputIdentifierCase="AS_IS":原样读取数据库元数据中的标识符(此处为大写)outputIdentifierCase="LOWER":将读取到的标识符转为小写输出到生成代码中
方案2:修改H2连接参数,让表名存储为小写
在JDBC连接URL中添加DATABASE_TO_LOWER=TRUE参数,示例:
jdbc:h2:mem:testdb;DATABASE_TO_LOWER=TRUE;DB_CLOSE_DELAY=-1
此参数会让H2直接存储Flyway脚本中的小写表名,jOOQ读取元数据时就会生成小写的DSL.name()参数。注意该参数会影响所有未加引号的标识符,需确认业务逻辑兼容。
方案3:给Flyway脚本中的表名加引号
在Flyway的SQL脚本中,给表名添加双引号强制H2保留小写:
CREATE TABLE "account_linking" ( -- 表结构定义 );
这种方式会让H2存储小写表名,jOOQ生成代码时自然使用小写标识符,但需要修改所有相关SQL脚本,成本较高。
内容的提问来源于stack exchange,提问作者Judy1989
相关产品推荐
相关产品推荐

