升级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
相关产品推荐
相关产品推荐

