Вручную вставьте данные из базы данных в таблицу с hibernate_sequence @GeneratedValue (стратегии = GenerationType.TABLE) - PullRequest
1 голос
/ 09 апреля 2020

У меня есть таблица с идентификатором @GeneratedValue (стратегии = GenerationType.TABLE). Необходимо вручную вставить 800 записей в производственную базу данных postgresql. У нас был переход с oracle на postgresql, немногие пользователи по ошибке получили доступ к старой ссылке и данным, вставленным в oracle. Пожалуйста, объясните, как сохранить hibernate_sequence в этом случае. В качестве производственной базы данных.

1 Ответ

0 голосов
/ 12 апреля 2020

На первом шаге проверьте таблицу генерации ключей и SEQUENCE_NAME.

Если вы используете настройку по умолчанию, вы увидите что-то следующее: адаптируйте дальнейшие шаги для другой конфигурации.

select * from hibernate_sequences;

SEQUENCE_NAME   NEXT_VAL
--------------- ----------
default         nnnnn

Теперь увеличьте NEXT_VAL на требуемое количество пропущенных записей. Чтобы избежать проблемы параллельной вставки через Hibernate, я использую LOCK TABLE - все вставки из Hibernate блокируются, пока вы не завершите sh действие ниже.

lock table hibernate_sequences in exclusive mode;
select * from hibernate_sequences;
-- remember the value of NEXT_VAL nnnn
update hibernate_sequences
set NEXT_VAL = NEXT_VAL + 800
where SEQUENCE_NAME = 'default';
commit;

Теперь у вас есть 800 ID nnnn + 1 .. nnnn + 800 для пропущенных строк.

Обратите внимание, что LOCK будет работать, если вы подключитесь к ВЛАДЕЛЬЦУ таблицы hibernate_sequences. Вы можете вообще пропустить LOCK, если приложение не работает и вставка невозможна.

Используйте идентичный INSERT, как вы видите в Hibernate show_sql, и с вашими данными передайте зарезервированный идентификатор.

Пример

-- Hibernate: insert into AUTHOR (name, AUTHOR_ID) values (?, ?)
insert into AUTHOR (name, AUTHOR_ID) values ('Psik', nnnn +1);
insert into AUTHOR (name, AUTHOR_ID) values ('Tuzka', nnnn+2);

Предупреждение

Как уже упоминалось в комментарии, вы должны запланировать переключение на отображение SEQUENCE, что будет сделать добавление пропущенных строк еще проще. См. Также , почему вы никогда не должны использовать таблицу-идентификатор-генератор-генератор-jpa-and-hibernate .

Сказав это, генератор TABLE может нормально работать в некоторых случаях, например, при небольшом количестве одновременных вставок. При использовании аналогичной аргументации утверждение может быть следующим: почему вы не должны использовать jpa-and-hibernate , если производительность имеет значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...