休眠:重复的键值违反唯一约束

问题描述 投票:7回答:3

我正在尝试使用Hibernate和Java EE将新记录插入到我的postgresql中。

这是我的模特:

@Entity
@SuppressWarnings("serial")
@Inheritance(strategy=InheritanceType.JOINED)
public class BaseDesign implements Serializable {

    @Id
    @Expose
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;

    @Version
    @Column(name = "version")
    private int version;

    @Expose
    @Column(name = "name")
    private String name;

    // getter and setter
}

这是我的import.sql

INSERT INTO basedesign (id, name, version) VALUES (1, 'China', 0);

构建代码时,记录被添加到数据库中。

但是,当我尝试使用EntityManager添加新记录时,如下所示:

BaseDesign design = new BaseDesign();
design.setName("USA");                  
em.persist(design);

我知道了:

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "basedesign_pkey"
  Detail: Key (id)=(1) already exists.

第二次执行同一命令,成功。

为什么Hibernate第一次不增加起始ID?以及如何配置它以最后插入的整数开始?

postgresql hibernate jpa constraints
3个回答
11
投票

当在Postgresql中创建bigserial列时,即为are actually creating a sequence。当您手动插入一个ID值'1'时,Postgresql不会更新序列以考虑到这一点。 Hibernate允许Postgresql使用序列生成ID,但是生成的第一个值是'1',这会冲突。第二个值很好。

如果您是通过在Hibernate之后直接使用SQL来创建问题的,则应以相同的方式解决此问题:use ALTER SEQUENCE to set the next value

ALTER SEQUENCE

1
投票

使用pgAdmin4,您可以按以下方式更改增量器以2(或更多)开头alter sequence basedesign_id_seq restart with 2;


0
投票

由于@Pipo和@Adrian Cox建议的序列需要手动编辑,因此与主键没有冲突。

我在SQL脚本的末尾使用了enter image description here命令,以避免您发布此错误以获得此错误

重复键值违反唯一约束

例如,在启动我的应用程序时,我在SQL脚本中以此方式(用于我的项目)来填充值:

alter sequence tableName_table_id_seq restart with 2;
© www.soinside.com 2019 - 2024. All rights reserved.