Последовательности не сбрасываются для имитации базы данных HSQL и вызывают нарушение ограничений между тестами JBehave.

Я сталкиваюсь с проблемами последовательности при написании тестов BDD с помощью нашего API (Spring + Hibernate). Мы используем JBehave в качестве средства запуска BDD и базы данных HSQL.

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

У меня две истории. Обе истории вставляются в таблицу DUMMYPRODUCT. Мы указываем, что перед каждым сценарием мы очищаем все данные и сбрасываем схему, используя следующее:

«ОТРЕЗАТЬ ПУБЛИЧНУЮ ИДЕНТИФИКАЦИЮ ПЕРЕЗАПУСКА СХЕМЫ И БЕЗ ПРОВЕРКИ»

Затем мы повторно инициализируем данные таблицы с помощью предопределенного сценария sql, который включает 2 вставки в DUMMYPRODUCT,

И сбрасывает последовательность (предположительно) с помощью

ПОСЛЕДОВАТЕЛЬНОСТЬ УДАЛЕНИЯ DUMMYPRODUCT_SEQ; СОЗДАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ DUMMYPRODUCT_SEQ НАЧАТЬ С 3 УВЕЛИЧИТЬ НА 10;

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

exception=java.sql.SQLIntegrityConstraintViolationException: нарушение ограничения целостности: уникальное ограничение или нарушение индекса; Таблица SYS_PK_10216: DUMMYPRODUCT

Опытные вставки поведения в DUMMYPRODUCT для DUMMYPRODUCTID

(DUMMYPRODUCTID)
Первая история
Сценарий
3
4

Следующая история
Сценарий
5
6< br/> 7
8
9
10
11
12
3
4
5 исключение
7 исключение
9 исключение
Сценарий
11
12
3
4
5
6
7
8
9
10
11 исключение
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Сценарий
27
28
29
30
31
32
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 исключение< br/> 29 исключений

Сталкивались ли вы с такими проблемами в прошлом с вашими реализациями HSQL?


person TheMayne    schedule 17.02.2014    source источник
comment
Я нашел эту ссылку, которая была предыдущей проблемой и была исправлена, но, похоже, это именно то, с чем я столкнулся. marc.info/?l=hsqldb-user&m=130856349508646   -  person TheMayne    schedule 17.02.2014
comment
groups.google.com/forum/#!topic/h2-database/ z7HmvPmvjV8 Усечение не сбрасывает последовательность   -  person TheMayne    schedule 17.02.2014


Ответы (2)


Оператор перезапускает последовательность IDENTITY, объявленную внутри таблицы:

TRUNCATE TABLE T RESTART IDENTITY AND COMMIT NO CHECK

Этот оператор делает то же самое для всех таблиц в схеме, а также сбрасывает последовательности, которые находятся за пределами таблиц:

TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK

Оператор удаления последовательности удаляет ее навсегда. Когда вы создадите его снова, от него не останется и следа.

Все вышеперечисленное можно проверить с помощью последней версии HSQLDB 2.3.X. Возможно, вы используете более старую версию или один из ваших операторов на самом деле не выполняется. Обратите внимание, что вы должны удалить последовательность с одним оператором и создать ее снова с другим оператором.

person fredt    schedule 17.02.2014
comment
Чтобы подтвердить, что я использую 2.3.2 - person TheMayne; 17.02.2014
comment
Если я отброшу схему, повторно инициализирую контекст весны (который загружает все объекты гибернации и настраивает hsqldb). Последовательности сбрасываются. Но это не выгодное решение - person TheMayne; 17.02.2014
comment
Я проверил вышеизложенное с вашей последовательностью в диспетчере баз данных, прежде чем ответить. Кажется, вы используете 2 разные базы данных или оператор не выполняется. - person fredt; 17.02.2014
comment
Насколько я вижу, проблема заключается в многопоточности и разрывах с нашей настройкой JBehave. Последовательность не удаляется и не создается заново, когда следующий поток начинает выполнение - person TheMayne; 17.02.2014
comment
mail-archive.com/[email protected]/ msg00837.html Это ближе к моему требованию. - person TheMayne; 18.02.2014

После запуска базы данных как отдельного экземпляра и перехода на H2db мы обнаружили источник нашей проблемы. БД не нравится, когда последовательности удаляются и воссоздаются или даже изменяются при каждом запуске сценария. Мы разделили наши сценарии на сценарий вставки данных и сценарий изменения последовательности. Данные очищаются с помощью dbunit, после чего при каждом запуске выполняется скрипт вставки. Последовательности изменяются только при запуске, а истории bdd последовательно увеличиваются, как и ожидалось.

person TheMayne    schedule 01.03.2014