代码之家  ›  专栏  ›  技术社区  ›  Daniel Gerber

导入液化酶后未更新休眠序列

  •  1
  • Daniel Gerber  · 技术社区  · 8 年前

    我有一个空的SpringBoot应用程序,我想在其中加载以前版本的数据。此数据已包含主键。因此,我使用Liquibase loadData方法:

    <column name="id" type="bigint" autoIncrement="${autoIncrement}">
        <constraints primaryKey="true" nullable="false"/>
    </column>
    <loadData tableName="point_of_interest" separator=";" file="classpath:config/liquibase/data/public.poi.csv">
    </loadData>
    
    // the java annotations
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    

    这正如预期的那样工作,但Hibernate序列没有更新。如果我想保存一个新对象,这会导致重复的主键。

    我做错了什么?

    干杯,丹尼尔

    2 回复  |  直到 8 年前
        1
  •  4
  •   Daniel Gerber    8 年前

    我的解决方案(从jHipster团队复制)是增加hibernate序列的起始值。这允许您插入ID为的所有数据< 启动值 因此不会发生碰撞:

    <changeSet id="00000000000000" author="jhipster" dbms="postgresql,oracle">
        <createSequence sequenceName="hibernate_sequence" startValue="20000" incrementBy="1"/>
    </changeSet>
    
        2
  •  1
  •   NehaM    7 年前

    添加到@Daniel的答案中,假设您正在使用Spring、Hibernate和liquibase,在您的changelog中添加一个序列

    <changeSet id="00000000000000" author="jhipster" dbms="postgresql,oracle"> <createSequence sequenceName="hibernate_sequence" startValue="20000" incrementBy="1"/> </changeSet>

    并修改实体中的主键列以使用 GenerationType.SEQUENCE 将解决这个问题。

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;