Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未重置模拟HSQL db的序列,并导致JBehave测试之间的约束冲突_Java_Spring_Hibernate_Integration Testing_Hsqldb - Fatal编程技术网

Java 未重置模拟HSQL db的序列,并导致JBehave测试之间的约束冲突

Java 未重置模拟HSQL db的序列,并导致JBehave测试之间的约束冲突,java,spring,hibernate,integration-testing,hsqldb,Java,Spring,Hibernate,Integration Testing,Hsqldb,在使用API(Spring+Hibernate)编写BDD测试时,我遇到了排序问题。 我们使用JBehave作为BDD运行程序和hsqldb 基本上,我创建了以下案例来解释我遇到的问题 我有两个故事。这两个故事都会插入一个名为DUMMYPRODUCT的表。 我们指定在每个场景之前,清除所有数据并使用以下命令重置模式: “截断架构公共重新启动标识并不提交检查” 然后我们使用预定义的sql脚本重新初始化表数据,该脚本包括对DUMMYPRODUCT的2个插入 并使用 产品的投放顺序; 创建序列DUMM

在使用API(Spring+Hibernate)编写BDD测试时,我遇到了排序问题。 我们使用JBehave作为BDD运行程序和hsqldb

基本上,我创建了以下案例来解释我遇到的问题

我有两个故事。这两个故事都会插入一个名为DUMMYPRODUCT的表。 我们指定在每个场景之前,清除所有数据并使用以下命令重置模式:

“截断架构公共重新启动标识并不提交检查”

然后我们使用预定义的sql脚本重新初始化表数据,该脚本包括对DUMMYPRODUCT的2个插入

并使用

产品的投放顺序; 创建序列DUMMYPRODUCT_SEQ,从3开始,递增10

但我遇到了非常奇怪的行为,因为故事和场景之间的序列没有重置。 相反,它们似乎继续到下一个故事/场景,然后在其中重置,即不进入下一个序列块,导致发生约束冲突

exception=java.sql.SQLIntegrityConstraintViolationException:完整性约束冲突:唯一约束或索引冲突;SYS_PK_10216表:DUMMYPRODUCT

经历的行为 为DUMMYPRODUCTID插入DUMMYPRODUCT

(DUMMYPRODUCTID)
第一个故事
情景
3
4

下一个故事
情景
5
6
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例外情况
29例外情况


您在过去的HSQL实现中是否遇到过此类问题?

该语句重新启动表中声明的标识序列:

TRUNCATE TABLE T RESTART IDENTITY AND COMMIT NO CHECK
此语句对架构中的所有表执行上述操作,并重置表外的序列:

TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK
删除序列的语句将永久删除该序列。当您再次创建它时,没有留下任何痕迹


以上所有内容都可以使用最新的HSQLDB2.3.X进行测试。您可能正在使用较旧的版本,或者您的一条语句可能没有实际执行。注意:您应该用一条语句删除序列,然后用另一条语句重新创建序列。

将db作为单独的实例运行并更改为H2db后,我们找到了问题的根源。db不喜欢在每个场景运行时删除、重新创建甚至更改序列。我们将脚本分为数据插入脚本和序列更改脚本。使用dbunit清除数据,然后在每次运行时插入脚本。序列仅在启动时更改,bdd故事按预期顺序递增。

我发现了此链接,它是以前的问题,已修复,但似乎正是我所面临的问题。Truncate不重置序列以确认我使用的是2.3.2如果我删除架构,请重新初始化spring上下文(加载所有hibernate实体并设置hsqldb),然后重置序列。但是这不是一个好的解决方案。在回答之前,我在数据库管理器中用您的序列测试了上述内容。看起来您使用的是两个不同的数据库,或者该语句没有执行。问题在于我们的JBehave设置的线程和中断。当下一个线程开始执行时,序列不会被删除并重新创建,这更接近我的要求。