繁体   English   中英

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

[英]Java jOOQ issue when trying to update a table using a POJO Record

我正在尝试执行一个简单的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

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

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

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

jOOQ之神卢卡斯·埃德(Lukas Eder),我等待着您的回来,将我从这冗长的沉睡中解救出来。

DSLContext.executeUpdate(R)要求RUpdatableRecord的子类型,这很有意义。 只有“可更新”(即知道其主键)的记录才能有效地更新。

看来,你的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/

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM