Liquibase + H2 + Junit主键序列重新开始

时间:2014-02-27 13:14:05

标签: java spring maven junit liquibase

我设法将Liquibase集成到我们的Maven构建中,用一些enrys初始化H2内存数据库。这些行具有使用序列表生成的主键,该表按预期工作(BigInt从1开始递增值)。

我的问题是,当我尝试在Junit集成测试中将新实体持久化到该表时,我得到“唯一键约束违规”,因为该新实体具有与使用该插入的第一行相同的主键。 Liquibase changelog-xmls。

因此初始化按预期完美地运行。 maven构建使用liquibase changelog-xmls

现在我只是在使用自己的Runner进行任何集成测试之前完全擦除相应的表格......但是这不可能在未来发生。由于目前还没有关于Liquibase的具体信息,因此它目前是调查此类问题的一个挑战。

更新解决方法

虽然id更喜欢下面使用H2回答问题,但是由于不支持所需的minValue,因此以下变更集无法正常工作。

<changeSet author="liquibase-docs" id="alterSequence-example">
  <alterSequence 
        incrementBy="1"
        maxValue="371717"
        minValue="40"
        ordered="true"
        schemaName="public"
        sequenceName="seq_id"/>

作为一个简单的解决方法,我现在只删除用于在第二个changeSet中插入testdata的现有序列:

 <changeSet id="2" author="Me">

    <dropSequence
        sequenceName="SEQ_KEY_MY_TBL"/>

    <createSequence 
        sequenceName="SEQ_KEY_MY_TBL" 
        incrementBy="1" 
        startValue="40"/>
</changeSet>

这样,将使用初始值为1的序列插入changelog - * .xml中配置的值。我插入30行,因此使用了Keys 1-30。之后,序列被删除并使用更高的startValue重新创建。这样,当从基于Junit的集成测试中持久化实体时,新实体将具有从40开始的主键,并且解决了先前的唯一约束问题。

非H2可能会很快发布支持minValue / maxValue的版本,因为相应的补丁已经存在。

更新

也许我们应该提到这仍然只是一个解决方法,任何人都知道H2是否支持带有Liquibase的序列在DB-Init之后不会重新开始?

1 个答案:

答案 0 :(得分:1)

您应该指示liquibase将这些序列的起始值设置为超出您创建的条目所使用的值。 Liquibase有一个alterSequence元素。您可以在当前liquibase脚本的末尾添加此类元素。