2017-03-14 145 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中的錯誤。

我創建了兩個問題,讓我們來看看哪一個是正確的: