【发布时间】:2017-07-14 21:48:32
【问题描述】:
我有一个空的 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;
这按预期工作,但休眠序列未更新。如果我想保存一个新对象,这会导致重复的主键。
我做错了什么?
干杯,丹尼尔
【问题讨论】:
-
我认为
GenerationType.AUTOJPA 将决定使用哪种策略来生成主键,这取决于数据库。那你用的是什么数据库? -
Guesswork:
GenerationType.AUTO导致一个表具有主键的序列,但这些仍由休眠启动。当您使用 liquibase 时,不涉及休眠,然后您的主键不会更新。 (我不是在谈论像 Oracle 中的真正序列,而是用于存储主键的纯表。我认为 mySQL 会这样做)。 -
我使用的是 postgresql 9.4+
-
您可以编辑您的问题并显示用于主键的“序列”(来自您的数据库)。我仍然认为
GenerationType.AUTO没有在您的 postgresql 数据库中创建真正的序列。它可能是一个普通的表,hibernate/jpa 正在使用它来生成你的主键。如果您使用 liquibase,则没有休眠,因此您的主键表不会更新。您可以尝试设置GenerationType.IDENTITY,看看是否会创建一个真实的序列。然后在数据库上完成主键生成,并且还应该使用 liquibase...
标签: hibernate jpa spring-boot liquibase