我们使用https://github.com/etiennestuder/gradle-jooq-plugin根据需要从数据库生成jOOQ类(DDL,带有CREATE TABLE语句的.sql文件)。但是,我们注意到,当在jooq.configurations.main.generationTool.generator中重写jooq.configurations.main.generationTool.generator时,我们开始看到奇怪的行为。
数据库模式
我们的表中有一些字段名,如_is_tombstone、_revision等。它们用于“元数据”,这不同于普通的“数据”列(来自另一个系统的数据与“元数据”日志事件的详细信息有关为什么触发更改)。
其他表,如id、name等,没有任何特殊的前缀。
发电机
以下是我们受https://www.jooq.org/doc/latest/manual/code-generation/codegen-generatorstrategy/启发的当前生成器策略
public class CustomNameGeneratorStrategy extends DefaultGeneratorStrategy {
@Override
public String getJavaMemberName( Definition definition, Mode mode ) {
String memberName = super.getJavaMemberName( definition, mode );
// Converts e.g. _IsTombstone to _isTombstone
if ( memberName.startsWith( "_" ) ) {
memberName = "" + memberName.charAt( 0 ) + toLowerCase( memberName.charAt( 1 ) ) + memberName.substring( 2 );
}
return memberName;
}
@Override
public String getJavaGetterName( Definition definition, Mode mode ) {
String methodName = super.getJavaGetterName( definition, mode );
methodName = methodName.replace( "_", "" );
// isTombstone() seems more natural than getIsTombstone()
methodName = methodName.replace( "getIs", "is" );
return methodName;
}
@Override
public String getJavaSetterName( Definition definition, Mode mode ) {
String methodName = super.getJavaSetterName( definition, mode );
return methodName.replace( "_", "" );
}
}问题所在
在上述情况下,下面的代码会导致一些非常讨厌的错误,某些字段没有从POJO复制到Record实例。只有id,name等才能工作。所有在名称中带有下划线的字段在复制中都被排除在外;它们在目标Record实例中具有Record值。
这反过来使DB插入失败,因为某些强制字段没有任何值。
import static some.package.Tables.GROUPS;
import some.package.tables.records.GroupRecord;
import some.package.tables.pojos.TSDBGroup;
// ...
TSDBGroup tsdbGroup = createTsdbGroup(...);
// The GroupRecord here becomes a "partial copy".
GroupRecord groupRecord = create.newRecord(GROUPS, tsdbGroup);
groupRecord.store();这一切为什么要发生?
发布于 2022-02-28 11:07:46
问题是,除非您用JPA样式的注释注释您的getter/setter,否则jOOQ希望以下之一是正确的:
setFoo表示名为foo或FOO的DB列),或foo表示名为foo或FOO的DB列)把这两条规则都打破,你就会坚持到底。:-)
更具体地说,这是由jOOQ中的下列代码引起的。
// No annotations are present
else {
members = getMatchingMembers(configuration, type, field.getName(), true);
method = getMatchingGetter(configuration, type, field.getName(), true);
}
// Use only the first applicable method or member
if (method != null)
Tools.setValue(record, field, method.invoke(source));
else if (members.size() > 0)
setValue(record, source, members.get(0), field);
}解决办法
简单的解决方法是删除自定义getJavaMemberName中的GeneratorStrategy方法。然后,当从POJO创建jOOQ s时,jOOQ能够按预期填充字段。
https://stackoverflow.com/questions/71294088
复制相似问题