我设法将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 回答
您应该指示liquibase将这些序列的起始值设置为超出您用于创建的条目的值 . Liquibase有一个alterSequence元素 . 您可以在当前liquibase脚本的末尾添加此类元素 .