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

升级jOOQ至3.18.6后,多引用同表时ForeignKey生成异常

在jOOQ 3.18.6中恢复旧版多外键生成行为的方法

我曾使用jOOQ 3.14.16从现有SQLite数据库生成表、记录及POJO。近期升级至3.18.6并重新执行代码生成后,发现当同一表被多次引用时,ForeignKey的生成逻辑发生变化:3.14.16版本会为每个引用列生成独立的ForeignKey实例,而3.18.6版本会将这些引用合并为一个ForeignKey。

版本生成代码对比

jOOQ 3.14.16生成的代码

public static final ForeignKey<DataRecord, TextIdentifierRecord> FK___DATA___TEXT_IDENTIFIER__1 = Internal.createForeignKey(Data.DATA, DSL.name("fk_Data_TextIdentifier_1"), new TableField[] { Data.DATA.TOPIC_ID }, Keys.PK___TEXT_IDENTIFIER, new TableField[] { TextIdentifier.TEXT_IDENTIFIER.TEXT_IDENTIFIER_ID }, true);
public static final ForeignKey<DataRecord, TextIdentifierRecord> FK___DATA___TEXT_IDENTIFIER__2 = Internal.createForeignKey(Data.DATA, DSL.name("fk_Data_TextIdentifier_2"), new TableField[] { Data.DATA.CORRECTED_LABEL_ID }, Keys.PK___TEXT_IDENTIFIER, new TableField[] { TextIdentifier.TEXT_IDENTIFIER.TEXT_IDENTIFIER_ID }, true);
public static final ForeignKey<DataRecord, TextIdentifierRecord> FK___DATA___TEXT_IDENTIFIER__3 = Internal.createForeignKey(Data.DATA, DSL.name("fk_Data_TextIdentifier_3"), new TableField[] { Data.DATA.LABEL_ID }, Keys.PK___TEXT_IDENTIFIER, new TableField[] { TextIdentifier.TEXT_IDENTIFIER.TEXT_IDENTIFIER_ID }, true);

jOOQ 3.18.6生成的代码

public static final ForeignKey<DataRecord, TextIdentifierRecord> FK___DATA__PK___TEXT_IDENTIFIER = Internal.createForeignKey(Data.DATA, DSL.name("fk_Data_pk_TextIdentifier"), new TableField[] { Data.DATA.TOPIC_ID, Data.DATA.CORRECTED_LABEL_ID, Data.DATA.LABEL_ID }, Keys.PK___TEXT_IDENTIFIER, new TableField[] { TextIdentifier.TEXT_IDENTIFIER.TEXT_IDENTIFIER_ID, TextIdentifier.TEXT_IDENTIFIER.TEXT_IDENTIFIER_ID, TextIdentifier.TEXT_IDENTIFIER.TEXT_IDENTIFIER_ID }, true);

相关表结构

CREATE TABLE "TextIdentifier" (
  "textIdentifierId" INTEGER PRIMARY KEY ,
  "text" TEXT NOT NULL
) STRICT
CREATE TABLE "Data" (
  "dataId" INTEGER PRIMARY KEY,
  "labelId" INTEGER NOT NULL REFERENCES "TextIdentifier"("textIdentifierId"),
  "correctedLabelId" INTEGER NULL REFERENCES "TextIdentifier"("textIdentifierId"), 
  "topicId" INTEGER NOT NULL REFERENCES "TextIdentifier"("textIdentifierId")) STRICT

解决方案

可以通过配置jOOQ代码生成器恢复旧版行为。这是因为jOOQ 3.15+版本默认将多个指向同一主键的单列外键合并为一个复合外键,而通过开启foreignKeysSingleColumnPerKey配置项,可以强制为每个单列外键生成独立的ForeignKey实例。

配置方式

如果使用XML配置文件,添加以下设置:

<generator>
  <database>
    <foreignKeysSingleColumnPerKey>true</foreignKeysSingleColumnPerKey>
  </database>
</generator>

如果使用编程式配置(Java代码):

Configuration configuration = new Configuration()
    .withGenerator(new Generator()
        .withDatabase(new Database()
            .withForeignKeysSingleColumnPerKey(true)
        )
    );

启用该配置后,重新执行代码生成,jOOQ会为每个引用列生成独立的ForeignKey对象,与3.14.16版本的行为一致。


内容的提问来源于stack exchange,提问作者Adrian Hanusch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:52:43