JOOQ CodeGen: не генерирует Java код для Oracle синонимов - PullRequest
0 голосов
/ 28 апреля 2020

Настройка:

  • JOOQ 3.13.1 Professional
  • dialect ORACLE12C

У нас есть 2 синонима, указывающих на разные таблицы.

синонимы:
TAB_CONFIGURATION указывает на таблицу (TAB _.._ 01 ... TAB _.._ 08)
TAB_CONFIGURATION_NEXT указывает на таблицу (TAB _.._ 01 ... TAB_ .._ 08)

таблицы:
TAB_CONFIGURATION_01
..
TAB_CONFIGURATION_08

Генератор кода JOOQ не генерирует классы Java для 2 синонимы (только для 8 таблиц). Я понятия не имею, почему нет.

Может ли генератор кода JOOQ обрабатывать Oracle синонимов вообще?

1 Ответ

2 голосов
/ 01 мая 2020

Синонимы пока не поддерживаются таким образом, начиная с jOOQ 3.13

Это действительно было бы полезно, однако, оно еще не реализовано в jOOQ с 3.13: https://github.com/jOOQ/jOOQ/issues/1563.

Oracle не сообщает синонимы как обычные таблицы через словарные представления, такие как SYS.ALL_TABLES или SYS.ALL_TAB_COLS, поэтому не так просто обнаружить синонимы, как обычные таблицы, включая:

  • Информация о таблице
  • Информация о столбце
  • Информация об ограничении

Вся эта информация должна быть обнаружена путем рекурсивного обхода графа, представленного в SYS.ALL_SYNONYMS.

Однако, начиная с jOOQ 3.13, SYS.ALL_SYNONYMS подвергается тщательному анализу, когда процедуры / пакеты ссылаются на типы данных через синонимы, в случае если синонимы преобразуются в фактический тип данных.

Обходной путь: Представления

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

Итак, если у вас есть:

CREATE TABLE tab_configuration_01 (...);
CREATE TABLE tab_configuration_02 (...);
...
CREATE TABLE tab_configuration_08 (...);

Вместо определения:

CREATE SYNONYM tab_configuration FOR tab_configuration_02;
CREATE SYNONYM tab_configuration_next FOR tab_configuration_03;

Вы также можете определить:

CREATE VIEW view_configuration AS SELECT * FROM tab_configuration_02;
CREATE VIEW view_configuration_next AS SELECT * FROM tab_configuration_03;

Это уже работает из коробки в jOOQ. Преимущество: Вы можете получить доступ как к фактическим таблицам с суффиксом цифра c, если хотите, так и к представлению. Вы можете обновить определение представления в базе данных, не изменяя свой клиентский код, т.е. без его регенерации (при условии, что все ваши таблицы одинаковы).

Обходной путь: стратегия генератора jOOQ

Вы можете определить сгенерированные имена классов и идентификаторов, используя «стратегии генераторов»:

Например:

<generator>
  <strategy>
    <matchers>
      <tables>
        <table>
          <expression>TAB_CONFIGURATION_02</expression>
          <tableClass>
            <transform>PASCAL</transform>
            <expression>TAB_CONFIGURATION</expression>
          </tableClass>
          <tableIdentifier>
            <transform>AS_IS</transform>
            <expression>TAB_CONFIGURATION</expression>
          </tableIdentifier>
        </table>
        <table>
          <expression>TAB_CONFIGURATION_03</expression>
          <tableClass>
            <transform>PASCAL</transform>
            <expression>TAB_CONFIGURATION_NEXT</expression>
          </tableClass>
          <tableIdentifier>
            <transform>AS_IS</transform>
            <expression>TAB_CONFIGURATION_NEXT</expression>
          </tableIdentifier>
        </table>
      </tables>
    </matchers>
  </strategy>
</generator>

Преимущество: вам не нужен новый объект базы данных для вашего "синонима". Но вы больше не можете ссылаться на исходные таблицы с нумерацией c из клиентского кода, потому что они могут быть переименованы во что-то другое. Кроме того, вы должны заново генерировать код jOOQ каждый раз, когда вы хотите изменить «синоним».

...