Невозможно создать записи, используя собственную стратегию генератора для имен геттеров.

У меня jOOQ 3.13.1, dropwizard 2.0.7. Чтобы объединить jOOQ и dropwizard, я использую (https://droptools.bendb.com/jooq/). Я использую собственную стратегию генерации, чтобы поддерживать случай верблюда для моих сеттеров и геттеров. Имена приходят, как и ожидалось.

Объекты записей имеют данные для соответствующих столбцов. Тем не менее, я продолжаю получать ошибки из моей базы данных, что я пытаюсь установить нуль для столбца, отличного от нуля.

Я вижу эту проблему только тогда, когда пытаюсь создать новую запись. Обновление записей работает нормально.

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}|
+------+------+--------------+--------------------------------------------------+------------------------------+------------------------------+------+

Мои имена геттеров: 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());
  }
}

person Shubh Ketan Agarwal    schedule 19.03.2021    source источник


Ответы (1)


Я нашел проблему. Оказывается, это было объяснено на https://groups.google.com/g/jooq-user/c/1iy0EdWe_T8/m/YN9PEsIF4lcJ. Мой обходной путь состоял в том, чтобы использовать POJO, сгенерированный jOOQ. Чтобы создать новую запись, вместо передачи объекта класса Record я теперь передаю объект класса POJO.

person Shubh Ketan Agarwal    schedule 26.03.2021