liquibase 导入后 Hibernate 序列未更新
Hibernate sequence not updated after liquibase import
我有一个空的 Spring 启动应用程序,我想在其中加载以前版本的数据。此数据确实已包含主键。因此我使用 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 序列未更新。如果我想保存一个新对象,这会导致重复的主键。
我做错了什么?
干杯,丹尼尔
我对这个问题的解决方案(从 jHipster 团队复制而来)是增加休眠序列的起始值。这允许您插入 ID 小于 startValue 的所有数据,因此不会发生冲突:
<changeSet id="00000000000000" author="jhipster" dbms="postgresql,oracle">
<createSequence sequenceName="hibernate_sequence" startValue="20000" incrementBy="1"/>
</changeSet>
添加到@Daniel 的回答,假设您正在使用 Spring,使用 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;
我有一个空的 Spring 启动应用程序,我想在其中加载以前版本的数据。此数据确实已包含主键。因此我使用 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 序列未更新。如果我想保存一个新对象,这会导致重复的主键。
我做错了什么?
干杯,丹尼尔
我对这个问题的解决方案(从 jHipster 团队复制而来)是增加休眠序列的起始值。这允许您插入 ID 小于 startValue 的所有数据,因此不会发生冲突:
<changeSet id="00000000000000" author="jhipster" dbms="postgresql,oracle">
<createSequence sequenceName="hibernate_sequence" startValue="20000" incrementBy="1"/>
</changeSet>
添加到@Daniel 的回答,假设您正在使用 Spring,使用 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;