当前位置: 首页 > 知识库问答 >
问题:

无法使用自定义生成器策略为getter名称创建记录

柯河
2023-03-14

我在jOOQ 3.13.1,dropwizard 2.0.7。为了将jOOQ和dropwizard放在一起,我使用(https://droptools.bendb.com/jooq/)。我使用自定义生成策略来为我的setter和getter维护骆驼大小写。名称按预期进入。

记录对象具有各自列的数据。然而,我不断从数据库中获取错误,我试图在非空列上设置“null”。

我只有在尝试创建新记录时才看到这个问题。更新记录效果很好。

ERROR [2021-03-18 14:58:05,363] com.bendb.dropwizard.jooq.jersey.LoggingDataAccessExceptionMapper: Error handling a request: 9f65c0316d996ebb
! org.postgresql.util.PSQLException: ERROR: null value in column "createdAt" of relation "failures" violates not-null constraint
!   Detail: Failing row contains (265, null, Some callback, User account not found, null, null, null).

如果我打印记录,它看起来像这样:

+------+------+--------------+--------------------------------------------------+------------------------------+------------------------------+------+
|    id|userId|action        |error                                             |createdAt                     |updatedAt                     |status|
+------+------+--------------+--------------------------------------------------+------------------------------+------------------------------+------+
|{null}|{null}|*Some callback|*User account not found|*2021-03-18 14:58:05,363|*2021-03-18 14:58:05,363|{null}|
+------+------+--------------+--------------------------------------------------+------------------------------+------------------------------+------+

我的getter名称是:“getId”、“getUserId”、“getAction”、“getError”、“getCreatedAt”、“getUpdatedAt”、“getStatus”。

对于小写的列,我看不到任何问题。该问题适用于列名为CamelCase的位置。

该类看起来像:

public class FailureDao {

  private final DSLContext database;

  public FailureDao(DSLContext database) {
    this.database = database;
  }

  public void storeFailure(FailureRecord failure) {
    database.newRecord(FAILURES, failure).store();
  }
}

对于代码生成,我遵循这里的文档https://www.jooq.org/doc/3.13/manual/code-generation/codegen-generatorstrategy/

我的生成器类看起来像:

public class AsInDatabaseStrategy extends DefaultGeneratorStrategy {

  @Override
  public String getJavaIdentifier(Definition definition) {
    return definition.getOutputName().toUpperCase();
  }

  @Override
  public String getJavaSetterName(Definition definition, Mode mode) {
    return "set" + StringUtils.toUC(definition.getOutputName());
  }

  @Override
  public String getJavaGetterName(Definition definition, Mode mode) {
    return "get" + StringUtils.toUC(definition.getOutputName());
  }
}

共有1个答案

邓光赫
2023-03-14

我发现了这个问题。原来,它是在https://groups.google.com/g/jooq-user/c/1iy0EdWe_T8/m/YN9PEsIF4lcJ.上解释的。我的解决方法是使用jOOQ生成的POJO。要创建一条新记录,我现在传递的不是记录类的对象,而是POJO类的对象。

 类似资料:
  • 我需要一个自定义id生成器,保存最后使用的id,而不是下一个可用的,所以基于这个答案https://stackoverflow.com/a/10648572/187423我创建了一个自定义生成器扩展TableGenerator。 我已经在调试模式下确定我的自定义生成器没有被添加到org.hibernate.id.factory.internal.DefaultIdfierGeneratorFact

  • 我有一个简单的测试套件(对这个例子来说非常简单)。我在构造函数上使用@Factory表示法和一个@DataProvider,它返回一个城市对象[][](多达100个),我运行我的测试。在这个例子中有3个@Test方法。如果我不将测试名称附加到城市名称,我将有一个超文本语言标记报告,它只会一遍又一遍地列出3个测试方法,无法区分它们。 我尝试过这样的例子:这里。 我的测试课做得很好。我遇到的问题是,当

  • 这类似于这个问题,但我们用Gradle代替。假设我们在构建脚本中直接使用jOOQ的代码生成,正如文档中所描述的那样。 有两个问题。首先,我们将向生成器配置中添加一个新的策略,这应该很简单: 然而,如果我们打印得到的XML配置,名称元素就会被神秘地省略(也会被悄悄地省略): 其次,可以使用什么机制来预编译生成器策略类()并使其在构建脚本的类路径中可用?这里有一个可能的问题:策略代码依赖于jOOQ的c

  • 使用jOOQ,我可能希望将jOOQ代码生成器与Maven和自定义生成器策略结合使用。看起来这可以这样做(省略不相关的部分): 上面的配置描述了问题。jOOQ的代码生成器挂钩到Maven生命周期的生成目标,它发生在生命周期的编译目标之前。但是,对于代码生成,它需要一个预编译的自定义策略类,否则我会得到一个。如何使用Maven解决这个问题?我可以在执行目标之前编译单个类吗?

  • 我遇到了Hibernate映射问题:无法解释ID生成器策略:堆栈跟踪: 我的Custome ID生成器类如下所示: 我在谷歌上搜索过,但找不到解决方案。请让我知道,如果我做了任何错误或有解决办法。谢谢

  • 我正在尝试使用此示例中指定的id_token_hint参数从JWT令牌传递姓氏、givenName和displayName声明:https://github.com/azure-ad-b2c/samples/tree/master/policies/invite 我遵循了与本文中指定的步骤类似的步骤:Azure Active Directory B2C自定义邀请策略-在步骤之间传递自定义声明 我的