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

VHa*_*ded 7 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
}
Run Code Online (Sandbox Code Playgroud)

这是我的import.sql

INSERT INTO basedesign (id, name, version) VALUES (1, 'China', 0);
Run Code Online (Sandbox Code Playgroud)

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

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

BaseDesign design = new BaseDesign();
design.setName("USA");                  
em.persist(design);
Run Code Online (Sandbox Code Playgroud)

我有:

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

第二次执行相同的命令,并且成功.

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

Adr*_*Cox 10

bigserial在Postgresql中创建列时,实际上是在创建序列.手动插入ID值为"1"时,Postgresql没有更新序列以将其考虑在内.Hibernate允许Postgresql使用序列生成ID,但产生的第一个值是'1',它会发生冲突.第二个值很好.

如果您通过在Hibernate后面直接使用SQL来创建问题,则应该以相同的方式修复它:用于ALTER SEQUENCE设置下一个值:

alter sequence basedesign_id_seq restart with 2;
Run Code Online (Sandbox Code Playgroud)

  • 问题是您手动插入ID的SQL插入语句.系统可以自动获取ID,前提是您*始终*让系统生成ID,并且永远不会为id列提供值. (2认同)