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

时间:2018-06-12 15:08:06

标签: 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在编译之前给出了这个错误:

  DSLContext中的

executeUpdate(R)无法应用于   (mypackage.database.model.h2.public_.tables.records.ExpressaoRecord)   原因:没有类型变量R的实例存在   ExpressaoRecord符合UpdatableRecord

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

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

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

jOOQ之神Lukas Eder,我等待你的回归,让我免于这种冗长的沉睡。

2 个答案:

答案 0 :(得分:0)

DSLContext.executeUpdate(R)要求R成为UpdatableRecord的子类型,这是有道理的。只有一个可以更新的记录" (即知道其主键)可以有效地更新。

您的ExpressaoRecord似乎不是UpdatableRecord,而只是TableRecord。这有几个原因:

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

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

您的桌子没有主键。

如果没有主键,代码生成器就不会生成UpdatableRecord

您可以向表中添加主键,也可以告诉代码生成器一个&#34;合成主键&#34;:

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

或者,你可以&#34;覆盖&#34;通过将任何唯一键作为主键处理您的主键:

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

答案 1 :(得分:0)

问题似乎与nu.studer.jooq插件有关,因为在使用其他代码生成器时,反映具有主键的表的H2数据库模型类会收到UpdatableTable扩展/实现。

我在插件上打开了一个问题,对于那些想要关注它的人,你可以检查插件github页面中已经链接过几行的未解决问题。

插件的新版本(版本3.x +)似乎解决了这个问题。升级时要小心,因为插件配置中有许多重大更改,它也会强制使用新的jOOQ版本(3.11+)。