我正在尝试执行一个简单的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,我等待你的回归,让我免于这种冗长的沉睡。
答案 0 :(得分:0)
DSLContext.executeUpdate(R)
要求R
成为UpdatableRecord
的子类型,这是有道理的。只有一个可以更新的记录" (即知道其主键)可以有效地更新。
您的ExpressaoRecord
似乎不是UpdatableRecord
,而只是TableRecord
。这有几个原因:
<relations/>
标志 <relations>false</relations>
可用于关闭所有与关系相关的功能的生成,包括主键,外键信息。如果没有此信息,您实际上无法生成UpdatableRecord
类型。
如果没有主键,代码生成器就不会生成UpdatableRecord
。
您可以向表中添加主键,也可以告诉代码生成器一个&#34;合成主键&#34;:
或者,你可以&#34;覆盖&#34;通过将任何唯一键作为主键处理您的主键:
答案 1 :(得分:0)
问题似乎与nu.studer.jooq插件有关,因为在使用其他代码生成器时,反映具有主键的表的H2数据库模型类会收到UpdatableTable扩展/实现。
我在插件上打开了一个问题,对于那些想要关注它的人,你可以检查插件github页面中已经链接过几行的未解决问题。
插件的新版本(版本3.x +)似乎解决了这个问题。升级时要小心,因为插件配置中有许多重大更改,它也会强制使用新的jOOQ版本(3.11+)。