我设法将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之后不会重新开始?
答案 0 :(得分:1)
您应该指示liquibase将这些序列的起始值设置为超出您创建的条目所使用的值。 Liquibase有一个alterSequence元素。您可以在当前liquibase脚本的末尾添加此类元素。