我有一个空的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序列。如果我想保存新对象,会导致重复主键。
我做错了什么?
干杯,丹尼尔
答案 0 :(得分:2)
我的解决方案(从jHipster团队复制)到这个问题是增加hibernate序列的起始值。这允许您插入ID
<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;