Как обработать предупреждение об амортизации jOOQ для процедуры, которая возвращает триггер? - PullRequest
1 голос
/ 24 сентября 2019

Я использую следующую хранимую процедуру для поддержания времени редактирования нескольких таблиц с помощью триггеров для этих таблиц:

        CREATE OR REPLACE FUNCTION maintain_edit_time()
        RETURNS TRIGGER AS $t_edit_time$
        BEGIN
        NEW.edit_timestamp = NOW();
        RETURN NEW;
        END;
        $t_edit_time$ LANGUAGE plpgsql;

При создании объектов jOOQ для рассматриваемой базы данных я получаю следующий сгенерированный код:

 /**
 * @deprecated Unknown data type. Please define an explicit {@link org.jooq.Binding} to specify how this type should be handled. Deprecation can be turned off using <deprecationOnUnknownTypes/> in your code generator configuration.
 */
@java.lang.Deprecated
public static Object maintainEditTime(Configuration configuration) {
    MaintainEditTime f = new MaintainEditTime();

    f.execute(configuration);
    return f.getReturnValue();
}

/**
 * @deprecated Unknown data type. Please define an explicit {@link org.jooq.Binding} to specify how this type should be handled. Deprecation can be turned off using <deprecationOnUnknownTypes/> in your code generator configuration.
 */
@java.lang.Deprecated
public static Field<Object> maintainEditTime() {
    MaintainEditTime f = new MaintainEditTime();

    return f.asField();
}

Я предполагаю, что это потому, что у меня нет привязки jOOQ между TRIGGER и объектом Java.Однако я не имею ни малейшего представления о том, как бы я определил эту привязку, и при этом у меня нет необходимости в существовании привязки.

Однако, если оставить его в покое, выдается предупреждение о компиляции.Какой самый простой и простой способ решить эту проблему?

Параметры включают отключение устаревания, использование ignoreProcedureReturnValues ​​или создание привязки.В идеале я хотел бы просто не создавать объект Java для этой процедуры, но я не мог найти способ сделать это.

Использование ignoreProcedureReturnValues ​​глобально влияет на проект только из-за этого, что сейчас хорошо, у меня вообще нет других процедур, тем более других с возвращаемым значением.Но я ненавижу ограничивать будущее использование.Кроме того, мне непонятно, что за комментарий «Эта функция устарела с jOOQ 3.6.0 и будет удалена снова в jOOQ 4.0».значит на сайте jOOQ под этим флагом.Флаг исчезает или поддержка типов возвращаемых хранимых процедур исчезает?Короткое изучение проблем jOOQ github не дало мне ответа.

Соблазн просто отключить амортизацию.Это также кажется глобальным и не выгодным изменением, но оно послужит цели.

Если я создал привязку, я понятия не имею, что она будет делать или как ее определять, поскольку TRIGGER действительно не является разумной вещью для привязки объекта Java.Я предполагаю, что я бы указал в качестве значения TRIGGER в элементе disabledType, но привязка Java в лучшем случае кажется пустой тратой времени, а в худшем - вводит в заблуждение.

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

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

Использование ignoreProcedureReturnValues ​​глобально влияет на проект только из-за этого, что хорошо, пока у меня нет других процедур,намного меньше других с возвращаемым значением.Но я ненавижу ограничивать будущее использование.Кроме того, мне непонятно, что за комментарий «Эта функция устарела с jOOQ 3.6.0 и будет удалена снова в jOOQ 4.0».значит на сайте jOOQ под этим флагом.Флаг исчезает или поддержка типов возвращаемых хранимых процедур исчезает?Краткий обзор проблем jOOQ github не дал мне ответа.

Этот флаг был введен из-за несовместимых назад изменений в генераторе кода, которые затронули только SQL Server: https://github.com/jOOQ/jOOQ/issues/4106

В SQL Server процедуры всегда возвращают значение INT, как и функции.Это изменение позволило получить значение INT с использованием кода, сгенерированного jOOQ.В некоторых случаях было желательно не включать эту функцию при обновлении с jOOQ 3.5 до 3.6.В дальнейшем мы всегда будем генерировать этот тип возврата INT для хранимых процедур SQL Server.

Именно поэтому флаг не рекомендуется использовать с самого начала, так как мы не поощряем его использование, за исключением случаев обратногосовместимость использования.Это, вероятно, вам здесь не поможет.

Поддержка хранимых процедур определенно не устареет.

Соблазн просто отключить устаревание.Это также кажется глобальным и не выгодным изменением, но оно послужит цели.

Почему бы и нет.Быстрый обходной путь.Вам не нужно использовать весь сгенерированный код.Это означает, что вызов этой сгенерированной процедуры не будет работать «из коробки», поэтому его использование не рекомендуется.

Если я создал привязку, я понятия не имею, что она будет делатьили как его определить, поскольку TRIGGER на самом деле не имеет смысла связывать Java-объект.Я предполагаю, что я бы указывал как TRIGGER в элементе disabledType, но тогда связывание Java кажется в лучшем случае пустой тратой времени, а в худшем - вводить в заблуждение.

Действительно, это бы не принесло особой пользык вашим случаям использования, поскольку вы никогда не будете напрямую вызывать функцию триггера в PostgreSQL.

Опять же, ваше собственное решение с использованием <exclude> является идеальным решением здесь.В будущем мы могли бы предложить новый флаг конфигурации генерации кода, который позволяет включать / выключать генерацию функций триггера с отключением по умолчанию: https://github.com/jOOQ/jOOQ/issues/9270

1 голос
/ 24 сентября 2019

Что ж, после того, как я заметил, что идеальный способ сделать это - игнорировать эту процедуру, я нашел способ игнорировать процедуру по имени в в целом отличной документации на сайте jOOQ.Не знаю, как я пропустил первый проход.Если бы мне нужно было вызвать эту процедуру в Java, мне неясно, какой из перечисленных выше вариантов я бы использовал.

К счастью, в коде не было необходимости ссылаться на эту процедуру, и я исключил ее, как показано ниже в XML-конфигурации jOOQ.

<excludes>
    databasechangelog.*
    | maintain_edit_time
</excludes>
...