首页 文章

Liquibase H2 Junit主键序列重新开始

提问于
浏览
4

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

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

所以初始化按预期完美地运行 . maven构建使用liquibase changelog-xmls

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

Update Workaround

虽然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的版本,因为相应的补丁已经存在 .

Update:

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

1 回答

  • 1

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

相关问题