Java jOOQ проблема при попытке обновить таблицу с помощью записи POJO - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь выполнить простую функцию 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 даетЭта ошибка перед компиляцией:

executeUpdate (R) в DSLContext не может быть применен к (mypackage.database.model.h2.public_.tables.records.ExpressaoRecord) причине: нет экземпляровпеременные типа (типов) R существуют так, что ExpressaoRecord соответствует UpdatableRecord

В чем причина этой проблемы?Что я делаю не так?

Obs .: У меня есть 2 базы данных (firebird и h2), и я использую генератор jOOQ из Gradle для автоматической генерации pojos и других классов.Они не делятся POJO или чем-то сложным.Проект ОЧЕНЬ маленький и простой.

Obs 2 .: Я использовал несколько версий библиотек jOOQ (от 3.9 до новой 3.11), и проблема сохраняется.

Лукас Эдер, бог jOOQЯ жду вашего возвращения, чтобы спасти меня от этого многословного сна.

Ответы [ 2 ]

0 голосов
/ 18 июня 2018

Проблема, похоже, связана с плагином nu.studer.jooq , поскольку при использовании другого генератора кода классы модели базы данных H2, которые отражают таблицы с первичными ключами, получают расширение / реализацию UpdatableTable.

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

Новые выпуски плагина (версии 3.x +), похоже, исправили проблему.Будьте осторожны при обновлении, так как в конфигурации плагина есть много критических изменений, и это также заставляет использовать новую версию jOOQ (3.11+).

0 голосов
/ 13 июня 2018

DSLContext.executeUpdate(R) требует, чтобы R был подтипом UpdatableRecord, что имеет смысл.Только запись, которая является «обновляемой» (т.е. знает свой первичный ключ), может быть эффективно обновлена.

Похоже, что ваш ExpressaoRecord не UpdatableRecord, а просто TableRecord.Это может иметь несколько причин:

Вы деактивировали флаг <relations/> в генераторе кода.

<relations>false</relations> можно использовать для отключения генерации всех функций, связанных с отношениями, включая первичный ключ,информация внешнего ключа.Без этой информации вы фактически не можете генерировать UpdatableRecord типов.

В вашей таблице нет первичного ключа.

Без первичного ключа генератор кода не генерирует UpdatableRecord.

Вы можете добавить первичный ключ к своей таблице или сообщить генератору кода о «синтетическом первичном ключе»:

https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-synthetic-primary-keys/

Или выможет "переопределить" ваш первичный ключ, обрабатывая любой уникальный ключ как первичный ключ:

https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-override-primary-keys/

...