尝试使用POJO记录更新表时出现Java jOOQ问题
我试图执行一个简单的updateRecord函数,但它给了我一个错误,我找不到原因或其他人有它 可以在以下位置找到示例测试项目: Java代码:尝试使用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
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:真奇怪。我明天会尝试复制这个。也许这毕竟是第三方插件中的一个问题。。。