首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么重写jOOQ策略会中断从POJO到记录的复制?

为什么重写jOOQ策略会中断从POJO到记录的复制?
EN

Stack Overflow用户
提问于 2022-02-28 11:07:46
回答 1查看 134关注 0票数 2

我们使用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等。它们用于“元数据”,这不同于普通的“数据”列(来自另一个系统的数据与“元数据”日志事件的详细信息有关为什么触发更改)。

其他表,如idname等,没有任何特殊的前缀。

发电机

以下是我们受https://www.jooq.org/doc/latest/manual/code-generation/codegen-generatorstrategy/启发的当前生成器策略

代码语言:javascript
复制
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实例。只有idname等才能工作。所有在名称中带有下划线的字段在复制中都被排除在外;它们在目标Record实例中具有Record值。

这反过来使DB插入失败,因为某些强制字段没有任何值。

代码语言:javascript
复制
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();

这一切为什么要发生?

EN

回答 1

Stack Overflow用户

发布于 2022-02-28 11:07:46

问题是,除非您用JPA样式的注释注释您的getter/setter,否则jOOQ希望以下之一是正确的:

  1. 字段设置器的方法名称使用标准名称(setFoo表示名为fooFOO的DB列),或
  2. 字段名使用标准名称(foo表示名为fooFOO的DB列)

把这两条规则都打破,你就会坚持到底。:-)

更具体地说,这是由jOOQ中的下列代码引起的。

代码语言:javascript
复制
     // 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能够按预期填充字段。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71294088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档