liquibase导入

时间:2016-06-15 15:07:24

标签: hibernate jpa spring-boot liquibase

我有一个空的Spring Boot应用程序,我想在其中加载以前版本的数据。此数据已包含主键。因此我使用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 个答案:

答案 0 :(得分:2)

我的解决方案(从jHipster团队复制)到这个问题是增加hibernate序列的起始值。这允许您插入ID startValue ,因此不会发生冲突:

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

答案 1 :(得分:1)

添加@ Daniel的答案,假设您使用的是Spring,Hibernate使用liquibase,在更新日志中添加序列

<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;