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

JBA*_*JBA 5 java junit spring liquibase maven

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

我的问题是,当我尝试从 Junit 集成测试中将新实体持久化到该表中时,我得到“唯一键约束冲突”,因为该新实体与使用 Liquibase 更改日志插入的第一行具有相同的主键 - 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"/>
Run Code Online (Sandbox Code Playgroud)

作为一个简单的解决方法,我现在只需删除用于在第二个更改集中插入我的测试数据的现有序列:

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

    <dropSequence
        sequenceName="SEQ_KEY_MY_TBL"/>

    <createSequence 
        sequenceName="SEQ_KEY_MY_TBL" 
        incrementBy="1" 
        startValue="40"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

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

Rud*_*ela 1

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