Генерация индекса JmixGeneratedValue тип Integer

Перенес проект из MySQL в PostgreSQL и импортировал таблицы в Jmix через Data Store → Generate Model From Database. Поле инициализировано в классе

@JmixGeneratedValue
@Column(name = "ID", nullable = false)
@Id
private Integer id;

Также указано как униаклаьное значение
image

Но при добавлении индекс перезаписывает предыдущие значения, то есть не добавляется новое значение, а перезаписывается уже существующее.
Как быть с этим, хотелось бы сохранить тип поля Integer, для совместимости с предыдущей версии проекта

Добрый день, Иван.

Опишите сценарий более подробно, пошагово.

  • Что добавляете и что перезаписывается? Проблема с редактированием индекса или с добавлением данных в runtime?
  • Воспроизводится ли проблема на сущности, созданной с нуля?
  • Какая у вас версия Jmix?

С уважением,
Иван

  1. При добавлении новой записи через rest api формируется id, который уже существует, в итоге запись с этим id перезаписывается.
  2. В сущности, созданной с нуля id формируются как положено, по порядку. Проблема в том, что записи в таблице перенесены из другой базы, и как я понял jmix не может выставить текущий индекс для id. Как указать текущий id для генератора последовательностей нигде не нашел.
  3. Версия jmix 1.5

Добрый день.

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

Должно помочь выставление корректного значения в последовательности.

Для PostgreSQL:

  • Получите параметры проблемной последовательности:
    SELECT * FROM pg_sequences WHERE sequencename = '<sequence_name>';
    Интересующие параметры:
    • last_value - последнее запрошенное значение
    • increment_by - на сколько увеличивается last_value при каждом запросе следующего значения. Это сделано для in-memory кэширования порции ID и уменьшения числа запросов в базу. Размер зависит от значения свойства jmix.data.numberIdCacheSize (100 по-умолчанию).
  • Получите максимальный существующий ID для проблемной сущности:
    SELECT MAX(id) from <entity_table_name>;
    Если это значение больше, чем last_value из последовательности, то проблема актуальна.
  • Округлите вверх максимальный ID до значения, кратного инкременту. Пример: max ID = 54677, increment = 100 → новое значение последовательности будет 54700.
  • Установите новое значение последовательности:
    SELECT setval('<sequence_name>', <new_sequence_value>);

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

С уважением,
Иван