JPA自动生成ID时重复键错误

时间:2016-04-17 13:16:29

标签: java hibernate jpa

我对这个错误感到很困惑。我看了类似的答案,但找不到多少。因此,在尝试持久化实体后,我收到以下错误:

The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index

现在奇怪的是,我已将ID的生成设置为AUTO,因此我不知道可能会发生冲突。该实体如下:

@Entity
public class demo implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    int id;

    @NotNull
    String title;

    @NotNull
    String description;

    //getters & setters. . .
}

我试图通过调用此方法来保留新项目:

public void addNew(String title, String description){
    Demo demo = new Demo();
    demo.setTitle(title);
    demo.setDescription(description);

    em.persist(demo);
}

修改 为了填充我的表,我使用手写查询,直接进入sql数据库分配键1,2和3.如果我在数据库中没有数据一切正常..

2 个答案:

答案 0 :(得分:0)

顺便说一下,永远不要使用int作为PK,但是Integer,因此未分配(null)存在。我的猜测是AUTO无法正常工作,int默认0被多次使用。

答案 1 :(得分:0)

来自评论的

UPDATE 是Derby数据库。我认为问题是您使用GENERATED DEFAULT AS IDENTITY创建了没有START WITH子句的表。创建表时,请尝试使用START WITH 10或至少大于3的值。例如:

CREATE TABLE DEMO ( 
    ID bigint PRIMARY KEY
        GENERATED DEFAULT AS IDENTITY (START WITH 10, INCREMENT BY 1),
    TITLE varchar(250) NOT NULL,
    DESCRIPTION varchar(250) NOT NULL
)

更新在评论中回答有关从实体配置列的问题。 为id添加了@Column annotation。这样的事我应该这样做。 注意:未经测试!

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id" columnDefinition="BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 10, INCREMENT BY 1) NOT NULL", nullable="false"
private int id;