有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

在使用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实现中是否遇到过这样的问题


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

    TRUNCATE TABLE T RESTART IDENTITY AND COMMIT NO CHECK
    

    此语句对架构中的所有表执行上述操作,并重置表外的序列:

    TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK
    

    删除序列的语句将永久删除该序列。当你再次创建它时,没有留下任何痕迹

    所有这些都可以通过最新的HSQLDB 2.3进行测试。X您可能正在使用旧版本,或者您的一条语句可能没有实际执行。注意:你应该用一条语句删除序列,然后用另一条语句重新创建序列