Я пытаюсь подготовить интеграционный тест с тестовыми данными. Я читаю запросы вставки из внешнего файла и выполняю их как собственные запросы. После вставок я выполняю 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?