尝试使用 POJO 记录更新表时出现 Java jOOQ 问题

标签 java h2 jooq

我正在尝试执行一个简单的 updateRecord 函数,但它给我一个错误,我无法找到原因或任何其他人有它。

示例测试项目可以在以下位置找到: https://github.com/billbarni/jooq-studer-h2-test

Java代码:

import static mypackage.database.model.h2.public_.Tables.EXPRESSAO;
import mypackage.database.model.h2.public_.tables.pojos.Expressao;
import mypackage.database.model.h2.public_.tables.records.ExpressaoRecord;

public void updateQuery(Expressao expressaoPojo) {
  ExpressaoRecord expressaoRecord = ctx.newRecord(EXPRESSAO, expressaoPojo);
  ctx.executeUpdate(expressaoRecord); // Error with this parameter
}

数据库创建表达式:

CREATE TABLE
 expressao (
  id INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
  nome VARCHAR(50) NOT NULL,
  conteudo VARCHAR NOT NULL,
  qtd_tempo INT NOT NULL,
  tipo_tempo VARCHAR(5) NOT NULL,
  data_inicial TIMESTAMP NOT NULL
 );

Gradle 生成器配置:

plugins {
    id 'nu.studer.jooq' version '2.0.9'
}

dependencies {
    compile group: 'org.jooq', name: 'jooq-codegen', version: '3.10.4'
    jooqRuntime 'com.h2database:h2:1.4.197'
}

jooq {
    h2(sourceSets.main) {
        jdbc {
            driver = 'org.h2.Driver'
            url = 'jdbc:h2:file:./db'
            user = 'sa'
            password = ''
        }
        generator {
            name = 'org.jooq.util.DefaultGenerator'
            strategy {
                name = 'org.jooq.util.DefaultGeneratorStrategy'
            }
            database {
                name = 'org.jooq.util.h2.H2Database'
            }
            generate {
                relations = true
                deprecated = false
                records = true
                immutablePojos = true
                fluentSetters = true
            }
            target {
                packageName = 'mypackage.database.model.h2'
                directory = 'src/main/java'
            }
        }
    }
}

Java 在编译前给我这个错误:

executeUpdate (R) in DSLContext cannot be applied to (mypackage.database.model.h2.public_.tables.records.ExpressaoRecord)   reason: no instance(s) of type variable(s) R exist so that ExpressaoRecord conforms to UpdatableRecord

这个问题背后的原因是什么?我做错了什么?

观察:我有 2 个数据库(firebird 和 h2),我使用 Gradle 的 jOOQ 生成器自动生成 pojo 和其他类。他们不共享 POJO 或任何复杂的东西。该项目非常小且简单。

Obs 2.: 我使用了几个版本的 jOOQ 库(从 3.9 到新的 3.11),问题仍然存在。

Lukas Eder,jOOQ 之神,我等待你的归来,将我从冗长的沉睡中解救出来。

最佳答案

DSLContext.executeUpdate(R) 需要 R成为 UpdatableRecord 的子类型,这是有道理的。只有“可更新”(即知道其主键)的记录才能有效更新。

看来您的 ExpressaoRecord不是 UpdatableRecord , 但只是一个 TableRecord .这可能有几个原因:

您停用了 <relations/>代码生成器中的标志

<relations>false</relations>可用于关闭所有关系相关特征的生成,包括主键、外键信息。没有此信息,您实际上无法生成 UpdatableRecord类型。

您的表没有主键。

没有主键,代码生成器不会生成 UpdatableRecord .

您可以向表中添加一个主键,或者告诉代码生成器“合成主键”:

https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-synthetic-primary-keys/

或者,您可以通过将任何唯一键视为主键来“覆盖”您的主键:

https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-override-primary-keys/

关于尝试使用 POJO 记录更新表时出现 Java jOOQ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50820430/

相关文章:

java - 为具有不同模式的多个数据库生成 jOOQ 代码

java - 以编程方式清除缓存的后台进程

java - 打印文本文件的第一行

java - 如何检查 jOOQ 中是否存在表?

java - 为什么 jOOQ 建议将生成的代码放在 "/target"下而不是 "/src"下?

java - 如何使用 OutputStream 模拟虚拟文件对象以传递给 CSVWRITE?

java - 订阅 Google Pub/Sub 主题 X 秒,如果没有收到消息则停止

java - 使用 JPA 和 Hibernate 时 @Size、@Length 和 @Column(length=value) 的区别

java - Spring Boot,Spring Data JPA,CrudRepository,基于文件的只读数据库,打包在JAR中

hibernate - h2 的故障转移@Type?