jOOQ и автогенерация, как избежать записей UDT внутри POJO таблиц

Я определяю тип T и представление V в базе данных PostgreSQL.

CREATE TYPE my_type AS
(
  mt_column1 smallint NOT NULL
);

CREATE VIEW my_view
AS SELECT
   some_column_id integer
   ARRAY(SELECT
      ROW(an_int)::my_type
      FROM a_table
   ) AS my_view_types
  FROM a_regular_table 
  WHERE my_condition_hold);

Используя генерацию кода в выпуске 3.7, я получаю как класс записи UDT MyTypeRecord, так и класс записи таблицы MyViewRecord, а также класс POJO UDT MyType и класс POJO таблицы MyView.

Созданный MyView класс имеет массив MyTypeRecord.

public class MyView extends Object implements Serializable, Cloneable, IMyView {

    private static final long serialVersionUID = 1984808170;

    private final Long           some_column_id;
    private final MyTypeRecord[] my_view_types;
}

в то время как в POJO я ожидал бы массив POJO, например:

    private final MyType[] my_view_types;

Еще один интересный факт заключается в том, что pojo и запись для типа находятся в папке udt, а для представления они находятся в папке tables: возможно, это поможет найти решение / объяснение.

Есть ли способ сделать View преобразование только для pojo во время генерации?


По запросу я приложил рабочий пример, который генерирует записи и POJO, как я описал. Он доступен для FileDropper по этой ссылке.


Я также сообщаю об одной возможной уловке, позволяющей избежать этой проблемы, которую можно использовать, если вы действительно в отчаянии. Как сообщается в этом вопросе о переполнении стека / answer, jOOQ, даже если мы назначим POJO вместо записи, не сможет автоматически преобразовать массив записей в класс записи MyTypeRecord. Следовательно, вы можете проанализировать массив ROWs в json с помощью функции array_to_json. В моем примере это было бы:

CREATE VIEW my_view
AS SELECT
   some_column_id integer
   array_to_json(ARRAY(SELECT        
        ROW(an_int)::my_type         
      FROM a_table
   ))::json AS my_view_types
  FROM a_regular_table 
  WHERE my_condition_hold);

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


person JeanValjean    schedule 15.02.2016    source источник
comment
Теперь я вижу из класса JavaGenerator, что POJO UDT генерируются после POJO таблицы. Возможно, это причина того, что их нет в таблице POJO.   -  person JeanValjean    schedule 20.02.2016


Ответы (2)


Это ошибка в генераторе кода jOOQ:
https://github.com/jOOQ/jOOQ/issues/5103

Он появляется только в PostgreSQL при создании POJO для таблиц с массивами составных типов. В настоящее время я не вижу обходного пути.

person Lukas Eder    schedule 22.02.2016
comment
Привет, Лукас, спасибо за подсказку. Я пока отображаю все в json. Требуется дополнительное отображение, но работает (и я что-то теряю в производительности). Замечание к вашему предложению. Хотя сгенерированный в настоящее время код все еще работает в PostgreSQL, пользователи предпочитают не иметь никаких зависимостей записей jOOQ в своих сгенерированных POJO. Не работало также отображение из БД в POJO с использованием DSLContext из-за невозможности для преобразования строки в запись (та же проблема из здесь) - person JeanValjean; 22.02.2016
comment
@JeanValjean: Хм, эта проблема должна быть решена. Вы уверены, что он по-прежнему преобладает? Не могли бы вы показать пример для его воспроизведения (например, в качестве нового вопроса о переполнении стека или в группа пользователей) - person Lukas Eder; 23.02.2016
comment
Да, я предположил то же самое из комментариев по вышеупомянутой ссылке. Я обновлю пример, который я приложил к этому вопросу, и отправлю трассировку стека в группу пользователей, о которой вы сообщили. - person JeanValjean; 23.02.2016

Причина, по которой он делает то, что делает, заключается в том, что View не имеет PrimaryKey, связанного с ним, по крайней мере, не с большинством баз данных, я не могу придумать ни одной, которая сообщила бы PrimaryKey для представления.

Вы можете указать первичный ключ для генерации с помощью <syntheticPrimaryKeys> или <overridePrimaryKeys>, как описано в расширенная конфигурация генератора руководства.

Соответствующие части конфигурации jooq-meta :

<!-- A regular expression matching all columns that participate in "synthetic" primary keys,
       which should be placed on generated UpdatableRecords, to be used with

        - UpdatableRecord.store()
        - UpdatableRecord.update()
        - UpdatableRecord.delete()
        - UpdatableRecord.refresh()

       Synthetic primary keys will override existing primary keys. -->
  <syntheticPrimaryKeys>SCHEMA\.TABLE\.COLUMN(1|2)</syntheticPrimaryKeys>

<!-- All (UNIQUE) key names that should be used instead of primary keys on
       generated UpdatableRecords, to be used with

        - UpdatableRecord.store()
        - UpdatableRecord.update()
        - UpdatableRecord.delete()
        - UpdatableRecord.refresh()

        If several keys match, a warning is emitted and the first one encountered will be used.

        This flag will also replace synthetic primary keys, if it matches. -->
  <overridePrimaryKeys>MY_UNIQUE_KEY_NAME</overridePrimaryKeys>
person Community    schedule 18.02.2016
comment
Как бы это было в моем примере? - person JeanValjean; 18.02.2016
comment
ваш пример - неполный соломинка на этом этапе, вам нужно будет опубликовать более конкретный пример, но в документации довольно ясно, что делать, чтобы определить, какой первичный ключ должен быть в представлении. - person ; 18.02.2016
comment
попробуйте что-нибудь и вернитесь с конкретным вопросом, почему мой ответ не сработал. - person ; 18.02.2016
comment
Я попробовал. Кроме того, что теперь у меня есть аннотация @Id в POJO представления, я не вижу никаких изменений в отношении моего вопроса. - person JeanValjean; 19.02.2016
comment
Возможно, мне интересно, если этот ответ может помочь! - person JeanValjean; 19.02.2016
comment
ну, без предоставления чего-то более конкретного, чем этот пример с соломинкой с одним полем, вы, вероятно, не получите конкретного ответа. - person ; 19.02.2016
comment
Я приведу более конкретный пример, но поверьте, количество полей не имеет значения, одно, десять или сотня - одно и то же. - person JeanValjean; 19.02.2016
comment
У меня будет время поработать, чтобы помочь вам с решением проблемы, когда я вернусь домой с работы сегодня вечером, и я тоже не смогу поговорить с работы. - person ; 19.02.2016
comment
Я добавил ссылку на файл tar.gz, содержащий пример со схемой и соответствующими автоматически сгенерированными классами - person JeanValjean; 19.02.2016
comment
Позвольте нам продолжить это обсуждение в чате. - person ; 19.02.2016