2017-03-14 106 views
1

采用最新jOOQ与H2 1.4.194在Keys.java没有外键以下(减少)模式生成:如何让jOOQ生成不引用主键的复合外键?

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> 
+0

你有一个唯一约束或索引在't(a,b)'?上?它应该与一个约束一起工作,但也许没有索引 –

+0

我实际上在我的非简化例子中有一个唯一的约束 - 没有帮助。有趣的是,约束本身被生成为'createUniqueKey(T.T,“X”,T.T.A);' - 应该是'createUniqueKey(T.T,“X”,T.T.A,T.T.B);',对吧?再次,这在INFORMATION_SCHEMA中是正确的。 – coudy

+1

感谢您的详细信息。也许,为了完整起见,你能否用确切的唯一约束来更新你的问题?我认为这是一个错误。那么很快就会进行调查并给你一个答案。 –

回答

1

由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中的错误。

我创建了两个问题,让我们来看看哪一个是正确的: