Hibernate:重复键值违反了唯一约束

时间:2016-05-29 15:33:19

标签: postgresql hibernate jpa constraints

我正在尝试使用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);

当我构建代码时,记录将添加到db。

但是,当我尝试使用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?以及如何配置它以从最后插入的整数开始?

3 个答案:

答案 0 :(得分:10)

在Postgresql中创建<?php if($_POST['submit']){ $name = $_FILES['upload']['name']; $temp = $_FILES['upload']['tmp_name']; $type = $_FILES['upload']['type']; $size = $_FILES['upload']['size']; if(($type == "image/jpeg") || ($type == "image/jpg") || ($type == "image/gif")){ if($size <= 1000000){ move_uploaded_file($temp, "../img/news/$name"); }else{ echo "The file: '<b>$name</b>' is too big...<br> The size is <b>$size</b> and needs to be less than 100GB. "; } }else{ echo "This type '<b>$type</b>' is not allowed"; } } ?> 列时,您are actually creating a sequence。手动插入ID值为“1”时,Postgresql没有更新序列以将其考虑在内。 Hibernate允许Postgresql使用序列生成ID,但产生的第一个值是'1',它会发生冲突。第二个值很好。

如果您通过在Hibernate后面直接使用SQL来创建问题,则应该以相同的方式修复它:use ALTER SEQUENCE to set the next value

bigserial

答案 1 :(得分:0)

使用 pgAdmin4 ,我可以将增量器更改为以2(或更多)开头,如下所示 enter image description here

答案 2 :(得分:0)

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

我在SQL脚本的结尾处使用了alter sequence tableName_table_id_seq restart with 2;命令,以避免您发布此错误以获得

重复的键值违反了唯一约束

例如,在启动我的应用程序时,我在SQL脚本中使用了这样的代码(用于我的项目)来填充值:

INSERT INTO author(author_id, first_name, last_name) VALUES(9, 'Dan', 'Brown');
INSERT INTO book(book_id, amount, is_deleted, title, price) VALUES(17, 140, false, 'Hamlet', 22.61);
-- other inserts
-- ...
alter sequence author_author_id_seq restart with 10;
alter sequence book_book_id_seq restart with 18;