Как заставить hibernate синхронизировать последовательности? - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь подготовить интеграционный тест с тестовыми данными. Я читаю запросы вставки из внешнего файла и выполняю их как собственные запросы. После вставок я выполняю select setval('vlan_id_seq', 2000, true );. Вот определение идентификатора объекта:

@Id
@Column(name = "id", unique = true, nullable = false)
@GeneratedValue(strategy = IDENTITY)
private Integer id;

Когда я пытаюсь сохранить новую запись, я получаю исключение Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "vlan_pkey" Detail: Key (id)=(1) already exists.. Идентификатор последовательности - 2000. Определение столбца выполняется макросом serial и id integer NOT NULL DEFAULT nextval('vlan_id_seq'::regclass).

Я выполнил собственные запросы в пользовательской транзакции, поэтому все тестовые записи хранятся в базе данных postgresql, но похоже, что hibernate не синхронизирует последовательность. entityManager.flush(); также не вызывал синхронизацию последовательности. Похоже, что hibernate не использовал последовательности с @GeneratedValue(strategy = IDENTITY). Я использую XA-Datasource и wildfly 13.

Я тестировал сейчас другой метод инициализации. Я определил сценарий данных SQL (сгенерировал сценарий с помощью Jailer ) в файле persitence.xml (javax.persistence.sql-load-script-source) и завершил выполнение сценария с помощью select pg_catalog.setval('vlan_id_seq', (SELECT max(id) FROM vlan), true );. Я установил точку останова перед первой командой persist, проверил последовательность в db postgresql, последовательность имеет значение максимального идентификатора 16. Теперь сохраняется работоспособность, и запись имеет идентификатор 17. Сценарии выполняются до запуска диспетчера сущностей и перехода в спящий режим. прочитайте обновленные последовательности при запуске. Но это решение не ответило на мой вопрос.

Есть ли вероятность, что hibernate перечитает последовательности, чтобы использовать значение nextval?

1 Ответ

0 голосов
/ 17 сентября 2018

если стратегия Identity, это означает, что hibernate создаст таблицу последовательности и извлечет из нее идентификаторы. Используя встроенный sql, вы просто вставляете свои собственные значения без обновления этой таблицы, чтобы у вас было ДВА решения

  • Вставка с использованием самого hibernate, что будет довольно просто, в вашем интеграционном тесте внедрите ваши DAO и позвольте hibernate сделать вставку за вас, что рекомендуется, так что вам не нужно повторно обрабатывать то, что hibernate уже обрабатывало
  • Обновляйте таблицу последовательности всякий раз, когда вы выполняете вставку, увеличивая значение, которое я не рекомендую.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...