java - 如何让jOOQ生成不引用主键的复合外键?

标签 java h2 jooq

使用最新的 jOOQ 和 H2 1.4.194,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 的限制,或者因为您的模式中实际上没有任何外键,或者因为您正在生成 View ,所以您在生成的输出中丢失了外键,那么您可以创建synthetic objects ,包括synthetic primary keys , synthetic unique keys ,并从 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 如何在这些字典 View 中编码唯一约束存在误解。或者 H2 中的错误。

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

关于java - 如何让jOOQ生成不引用主键的复合外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42798080/

相关文章:

java - JOOQ 对 Axis2 Web 服务的支持

java - tomcat 将 404 状态更改为 403 以进行 http 删除

java - 使用java将字符串数组打印到文本文件

sql - 如何修复 SQL 语句中的 H2 语法错误?

database - 使用 Spring 启动和设置内存数据库

kotlin - 在类jooq中使用主键和引用方法有什么好处

java - Hibernate重复类名异常

java - 如何为 Maven 安装的 jar 编写 POM 文件?

database - 如何在H2数据库中使用FULL-TEXT SEARCH?

java - jOOQ 生成一个静态方法来调用函数,但没有方法将其作为字段获取