Postgresql 休眠:重复的键值违反了唯一约束
我正在尝试使用Hibernate和JavaEE将新记录插入到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
@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;