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

尝试使用POJO记录更新表时出现Java jOOQ问题,java,h2,jooq,Java,H2,Jooq,我试图执行一个简单的updateRecord函数,但它给了我一个错误,我找不到原因或其他人有它 可以在以下位置找到示例测试项目: 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

我试图执行一个简单的updateRecord函数,但它给了我一个错误,我找不到原因或其他人有它

可以在以下位置找到示例测试项目:

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
 );
渐变生成器配置:

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符合UpdateableRecord

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

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

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

卢卡斯·埃德尔,约克之神,我等待着你的归来将我从这冗长的沉睡中解救出来。

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

您的
expressaRecord
似乎不是一个
updateableRecord
,而只是一个。这可能有几个原因:

您已停用代码生成器中的
标志
false
可用于关闭所有关系相关功能的生成,包括主键、外键信息。如果没有这些信息,您实际上无法生成
updateableRecord
类型

您的表没有主键。 如果没有主键,代码生成器不会生成
updateableRecord

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

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


问题似乎出在插件上,因为当使用另一个代码生成器时,反映带有主键的表的H2数据库模型类接收可更新表扩展/实现

我在插件上打开了一个问题,对于那些想关注它的人,你可以在上面链接了几行的插件github页面中查看打开的问题


新版本的插件(版本3.x+)似乎已经解决了这个问题。升级时要小心,因为插件配置中有许多突破性的更改,这也迫使您使用新的jOOQ版本(3.11+)。

我在这里为您排忧解难。你能发布你的
EXPRESSAO
表的DDL(
CREATE TABLE
)吗?为了记录,这个问题也已经报告给gradle jooq插件:对不起,我花了这么长时间更新我的问题。现在包括创建我的表。也许我应该用其他的辛塔克斯?H2接受了这个假设,但在列标志中做了一些错误的事情?@MBarni:好的,那么假设1还没有得到证实。你能发布你的代码生成配置吗?问题用gradle配置更新。我正在使用一个第三方插件,可能是它导致了这个问题?@MBarni:这在那个第三方插件中是一个非常重要的问题,你不会是唯一一个受到影响的人,所以我排除了这个可能的原因。而且,您的配置看起来是正确的。只需再检查一件事:您的
ExpressaoRecord
是否扩展了
updateablerecordimpl
?如果删除了
包含的
规范,问题还会继续存在吗?@MBarni:真奇怪。我明天会尝试复制这个。也许这毕竟是第三方插件中的一个问题。。。