【发布时间】:2017-08-05 12:03:36
【问题描述】:
使用带有 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>
【问题讨论】:
-
t(a, b)上是否有唯一约束或索引?它应该与约束一起使用,但可能不适用于索引 -
在我的非简化示例中,我实际上有一个独特的约束 - 没有帮助。有趣的是,约束本身生成为
createUniqueKey(T.T, "X", T.T.A);——应该是createUniqueKey(T.T, "X", T.T.A, T.T.B);,对吧?同样,这在 INFORMATION_SCHEMA 中是正确的。 -
感谢您提供详细信息。也许,为了完整起见,您可以用确切的唯一约束更新您的问题吗?我认为这是一个错误。很快就会调查,然后给你一个答案。
-
嗯,有趣的更新。请问:你的主键不包含
b是什么原因? -
很好,是的,我能做到。我的一些表只关心用户,而不关心组织 - 在这些情况下,我的 FK 引用只是
(id),而不是(id, type)。我误解了级联删除引用非 PK 是不允许的。但是,这显然是错误的,所以我得救了!