我对这个错误感到很困惑。我看了类似的答案,但找不到多少。因此,在尝试持久化实体后,我收到以下错误:
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.如果我在数据库中没有数据一切正常..
答案 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;