如何让 jOOQ 生成不引用主键的复合外键?
How to make jOOQ generate composite foreign keys not referencing a primary key?
使用带有 H2 1.4.194 的最新 jOOQ,Keys.java
中没有为以下(简化的)模式生成外键:
CREATE TABLE t (a INT, b INT, PRIMARY KEY (a));
CREATE TABLE u (a INT, b INT, FOREIGN KEY (a,b) REFERENCES t (a,b));
按如下方式添加唯一约束没有帮助:
CREATE TABLE t (a INT, b INT, PRIMARY KEY (a), UNIQUE (a,b));
CREATE TABLE u (a INT, b INT, FOREIGN KEY (a,b) REFERENCES t (a,b));
更改 FK 以引用主键(无论是简单键还是复合键)都会使 FK 出现。
通过 H2 查询 FK 按预期工作。
看起来不像是回归(尝试了各种 3.x jOOQ),所以想知道我是否做错了什么。生成器配置(通过 maven 插件)如下:
<name>org.jooq.util.JavaGenerator</name>
<database>
<name>org.jooq.util.h2.H2Database</name>
<includes>.*</includes>
<excludes />
<inputSchema>PUBLIC</inputSchema>
</database>
解决缺少外键的问题
从 jOOQ 3.14 开始,如果您由于 jOOQ 的限制,或者因为您的模式中实际上没有任何外键,或者因为您正在生成视图而从生成的输出中丢失外键,您可以使用如下配置创建 synthetic objects, including synthetic primary keys, synthetic unique keys, and reference them from synthetic foreign keys:
<configuration>
<generator>
<database>
<syntheticObjects>
<foreignKeys>
<foreignKey>
<tables>U</tables>
<fields>
<field>A</field>
<field>B</field>
</fields>
<referencedTable>T</referencedTable>
<referencedFields>
<field>A</field>
<field>B</field>
</referencedFields>
</foreignKey>
</foreignKeys>
</syntheticObjects>
</database>
</generator>
</configuration>
有多种配置方法,例如通过名称引用或列引用等 check out the manual for details.
历史答案(这是一个错误)
jOOQ 代码生成器内部 运行 的查询是这样的:
select
"CROSS_REFERENCES"."FK_NAME",
"CROSS_REFERENCES"."FKTABLE_NAME",
"CROSS_REFERENCES"."FKTABLE_SCHEMA",
"CROSS_REFERENCES"."FKCOLUMN_NAME",
"CONSTRAINTS"."CONSTRAINT_NAME",
"CONSTRAINTS"."CONSTRAINT_SCHEMA"
from "INFORMATION_SCHEMA"."CROSS_REFERENCES"
join "INFORMATION_SCHEMA"."CONSTRAINTS"
on (
"CROSS_REFERENCES"."PK_NAME" = "CONSTRAINTS"."UNIQUE_INDEX_NAME"
and "CROSS_REFERENCES"."PKTABLE_NAME" = "CONSTRAINTS"."TABLE_NAME"
and "CROSS_REFERENCES"."PKTABLE_SCHEMA" = "CONSTRAINTS"."TABLE_SCHEMA"
)
where (
"CROSS_REFERENCES"."FKTABLE_SCHEMA" in (
'PUBLIC'
)
and "CONSTRAINTS"."CONSTRAINT_TYPE" in (
'PRIMARY KEY', 'UNIQUE'
)
)
order by
"CROSS_REFERENCES"."FKTABLE_SCHEMA" asc,
"CROSS_REFERENCES"."FK_NAME" asc,
"CROSS_REFERENCES"."ORDINAL_POSITION" asc
查询看似正确,但似乎对 H2 在这些字典视图中如何编码唯一约束存在误解。或 H2 中的错误。
我已经创建了两个问题,让我们看看哪个是正确的:
使用带有 H2 1.4.194 的最新 jOOQ,Keys.java
中没有为以下(简化的)模式生成外键:
CREATE TABLE t (a INT, b INT, PRIMARY KEY (a));
CREATE TABLE u (a INT, b INT, FOREIGN KEY (a,b) REFERENCES t (a,b));
按如下方式添加唯一约束没有帮助:
CREATE TABLE t (a INT, b INT, PRIMARY KEY (a), UNIQUE (a,b));
CREATE TABLE u (a INT, b INT, FOREIGN KEY (a,b) REFERENCES t (a,b));
更改 FK 以引用主键(无论是简单键还是复合键)都会使 FK 出现。
通过 H2 查询 FK 按预期工作。
看起来不像是回归(尝试了各种 3.x jOOQ),所以想知道我是否做错了什么。生成器配置(通过 maven 插件)如下:
<name>org.jooq.util.JavaGenerator</name>
<database>
<name>org.jooq.util.h2.H2Database</name>
<includes>.*</includes>
<excludes />
<inputSchema>PUBLIC</inputSchema>
</database>
解决缺少外键的问题
从 jOOQ 3.14 开始,如果您由于 jOOQ 的限制,或者因为您的模式中实际上没有任何外键,或者因为您正在生成视图而从生成的输出中丢失外键,您可以使用如下配置创建 synthetic objects, including synthetic primary keys, synthetic unique keys, and reference them from synthetic foreign keys:
<configuration>
<generator>
<database>
<syntheticObjects>
<foreignKeys>
<foreignKey>
<tables>U</tables>
<fields>
<field>A</field>
<field>B</field>
</fields>
<referencedTable>T</referencedTable>
<referencedFields>
<field>A</field>
<field>B</field>
</referencedFields>
</foreignKey>
</foreignKeys>
</syntheticObjects>
</database>
</generator>
</configuration>
有多种配置方法,例如通过名称引用或列引用等 check out the manual for details.
历史答案(这是一个错误)
jOOQ 代码生成器内部 运行 的查询是这样的:
select
"CROSS_REFERENCES"."FK_NAME",
"CROSS_REFERENCES"."FKTABLE_NAME",
"CROSS_REFERENCES"."FKTABLE_SCHEMA",
"CROSS_REFERENCES"."FKCOLUMN_NAME",
"CONSTRAINTS"."CONSTRAINT_NAME",
"CONSTRAINTS"."CONSTRAINT_SCHEMA"
from "INFORMATION_SCHEMA"."CROSS_REFERENCES"
join "INFORMATION_SCHEMA"."CONSTRAINTS"
on (
"CROSS_REFERENCES"."PK_NAME" = "CONSTRAINTS"."UNIQUE_INDEX_NAME"
and "CROSS_REFERENCES"."PKTABLE_NAME" = "CONSTRAINTS"."TABLE_NAME"
and "CROSS_REFERENCES"."PKTABLE_SCHEMA" = "CONSTRAINTS"."TABLE_SCHEMA"
)
where (
"CROSS_REFERENCES"."FKTABLE_SCHEMA" in (
'PUBLIC'
)
and "CONSTRAINTS"."CONSTRAINT_TYPE" in (
'PRIMARY KEY', 'UNIQUE'
)
)
order by
"CROSS_REFERENCES"."FKTABLE_SCHEMA" asc,
"CROSS_REFERENCES"."FK_NAME" asc,
"CROSS_REFERENCES"."ORDINAL_POSITION" asc
查询看似正确,但似乎对 H2 在这些字典视图中如何编码唯一约束存在误解。或 H2 中的错误。
我已经创建了两个问题,让我们看看哪个是正确的: