Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 休眠:重复的键值违反了唯一约束_Postgresql_Hibernate_Jpa_Constraints - Fatal编程技术网

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

Postgresql 休眠:重复的键值违反了唯一约束,postgresql,hibernate,jpa,constraints,Postgresql,Hibernate,Jpa,Constraints,我正在尝试使用Hibernate和JavaEE将新记录插入到postgresql中 这是我的模型: @Entity @SuppressWarnings("serial") @Inheritance(strategy=InheritanceType.JOINED) public class BaseDesign implements Serializable { @Id @Expose @GeneratedValue(strategy = GenerationType.I

我正在尝试使用Hibernate和JavaEE将新记录插入到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中创建
bigserial
列时,您需要。手动插入ID值“1”时,Postgresql没有更新序列以考虑这一点。Hibernate允许Postgresql使用该序列生成ID,但生成的第一个值是“1”,这会发生冲突。第二个值很好

如果您是在Hibernate之后直接使用SQL造成问题的,那么您应该用同样的方法解决它:


使用pgAdmin4I,您可以将incrementor更改为从2(或更多)开始,如下所示
正如@Pipo和@Adrian Cox建议的序列需要手动编辑,以便 与主键没有冲突

我使用了
altersequencetablename\u table\u id\u seq重新启动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;

所以这个解决方案必须给它分配一个已知的数字?它不能自动提取最后一个id?问题是您的SQL insert语句手动插入了一个id。如果您总是让系统生成id,并且从不为id列提供值,系统可以自动提取id。谢谢。我试图实现的是备份和恢复。当我从DB生成转储文件时,它附带了带有ID的INSERT语句。由于该ID不是由DB生成的,因此导致了上述问题。Postgresql备份和还原也应备份序列。是否正在转储单个表而不包括序列?感谢@AdrianCox这个答案让我无法在精神病院签名:)我从Excel电子表格导入数据,无法摆脱pkey违规行为。
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;