2014-02-27 76 views
3
開始

我設法將Liquibase整合到我們的Maven版本中,用一些enrys初始化H2內存數據庫。這些行具有使用按預期工作的序列表生成的主鍵(BigInt從1開始遞增的值)。Liquibase + H2 + Junit初始密鑰序列從

我的問題是,當我嘗試從一個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"/> 

作爲一種簡單的解決方法我現在只是刪除現有的序列用於插入我的TESTDATA在第二變更:

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

    <dropSequence 
     sequenceName="SEQ_KEY_MY_TBL"/> 

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

這樣的changelog-配置的值* .xml將使用初始值爲1的序列插入。我插入30行,以便使用Keys 1-30。之後,該序列被刪除並用更高的startValue重新創建。通過這種方式,當從基於Junit的集成中持久化實體時,新實體將具有從40開始的主鍵,並解決以前的唯一約束問題。

由於相應的修補程序已經存在,因此不會H2可能很快發佈支持minValue/maxValue的版本。

更新:

也許我們應該提到這一點,還是僅僅是一個解決辦法,任何人都知道,如果H2支持與Liquibase的序列DB-初始化之後不會重新開始嗎?

回答

1

您應該指示liquibase將這些序列的起始值設置爲超出您用於創建條目的值。 Liquibase對此有一個alterSequence元素。您可以在當前liquibase腳本的末尾添加這些元素。

+0

感謝您的輸入,聽起來不錯,但不幸的是似乎不支持H2(minValue ...)。瞬間!不知道如果我找出一種方法來做到這一點... – JBA

+0

我想出了一個簡單的H2解決方法,通過刪除序列並創建一個具有更高開始值的新建議,現在一切正常。非常感謝! – JBA