在填充的数据库中使用 @GeneratedValue(strategy=GenerationType.IDENTITY) 会导致 PK 约束错误
Using @GeneratedValue(strategy=GenerationType.IDENTITY) in populated database causes PK constraint error
我正在尝试将 FeedbackItem
项添加到我的数据库中。一般的想法是类型 Group
的现有对象可以接收多个 FeedbackItem
对象。然后我更新对象:
groupDAO.startTransaction();
groupDAO.update(selectedGroup);
groupDAO.commitTransaction();
//in groupDAO
public T update(T entity){
return em.merge(entity);
}
我不确定是否是 JPA 引起的问题,但会出现以下错误:
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL170430012202680' defined on 'FEEDBACKITEM'.
经过更多调试后,我发现了以下条目:
[EL Fine]: sql: 2017-04-30 01:22:14.977-- #### VALUES (?, ?) bind =>
[sampleText, 2]
[EL Fine]: sql: 2017-04-30
01:22:14.997--ClientSession(889348271)--Thread(Thread[JavaFX
Application Thread,5,main])--VALUES(1)
是否VALUES(1)
表示它试图在ID 1下插入对象?这是我目前唯一的线索。我的数据库填充了 10 个条目,ID 范围从 1 到 10。
下面是class我试图持久化到数据库:
@Entity
public class FeedbackItem implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int feedbackId;
private String feedback;
@ManyToOne(cascade = CascadeType.PERSIST)
private User ownerFeedback;
protected FeedbackItem(){
}
}
我在没有 @GeneratedValue(strategy=GenerationType.IDENTITY)
的情况下测试了我的代码,并手动分配了 ID。这没有任何问题。
编辑: 下面是 Group
实体:
@Entity
public class Group implements IReadOnlyGroup {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int groupId;
private String name;
@OneToMany(mappedBy = "group")
private List<Action> actions;
@OneToMany(cascade = CascadeType.PERSIST)
private List<Proposal> proposals;
@OneToMany(mappedBy = "group")
private List<Motivation> motivations;
@OneToOne(mappedBy = "group")
private GroupState currentState;
public Groep() {
}
}
Group
对象间接包含 FeedbackItem
个对象。每个 Proposal
存储一个 FeedbackItem
Entity
public class Proposal {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Temporal(TemporalType.TIMESTAMP)
private Date date = null;
@ManyToMany
private List<Action> actions;
@OneToOne
private FeedbackItem feedbackitem;
boolean approved;
protected Proposal() {
}
public Proposal ( List<Action> actions, String feedback, boolean approved, User owner){
this.date = new Date();
this.actions = actions;
this.approved = approved;
this.feedbackitem = new FeedBackItem(feedback, owner);
}
}
@OneToMany(cascade = CascadeType.PERSIST)
private List<Proposal> proposals;
表示Proposal实体与Group一起持久化,但不合并。在分配和持久化 Group 实体之前,应单独持久化其他实体。我会尝试删除此级联属性,并检查问题是否仍然存在。
我正在尝试将 FeedbackItem
项添加到我的数据库中。一般的想法是类型 Group
的现有对象可以接收多个 FeedbackItem
对象。然后我更新对象:
groupDAO.startTransaction();
groupDAO.update(selectedGroup);
groupDAO.commitTransaction();
//in groupDAO
public T update(T entity){
return em.merge(entity);
}
我不确定是否是 JPA 引起的问题,但会出现以下错误:
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL170430012202680' defined on 'FEEDBACKITEM'.
经过更多调试后,我发现了以下条目:
[EL Fine]: sql: 2017-04-30 01:22:14.977-- #### VALUES (?, ?) bind => [sampleText, 2]
[EL Fine]: sql: 2017-04-30 01:22:14.997--ClientSession(889348271)--Thread(Thread[JavaFX Application Thread,5,main])--VALUES(1)
是否VALUES(1)
表示它试图在ID 1下插入对象?这是我目前唯一的线索。我的数据库填充了 10 个条目,ID 范围从 1 到 10。
下面是class我试图持久化到数据库:
@Entity
public class FeedbackItem implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int feedbackId;
private String feedback;
@ManyToOne(cascade = CascadeType.PERSIST)
private User ownerFeedback;
protected FeedbackItem(){
}
}
我在没有 @GeneratedValue(strategy=GenerationType.IDENTITY)
的情况下测试了我的代码,并手动分配了 ID。这没有任何问题。
编辑: 下面是 Group
实体:
@Entity
public class Group implements IReadOnlyGroup {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int groupId;
private String name;
@OneToMany(mappedBy = "group")
private List<Action> actions;
@OneToMany(cascade = CascadeType.PERSIST)
private List<Proposal> proposals;
@OneToMany(mappedBy = "group")
private List<Motivation> motivations;
@OneToOne(mappedBy = "group")
private GroupState currentState;
public Groep() {
}
}
Group
对象间接包含 FeedbackItem
个对象。每个 Proposal
存储一个 FeedbackItem
Entity
public class Proposal {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Temporal(TemporalType.TIMESTAMP)
private Date date = null;
@ManyToMany
private List<Action> actions;
@OneToOne
private FeedbackItem feedbackitem;
boolean approved;
protected Proposal() {
}
public Proposal ( List<Action> actions, String feedback, boolean approved, User owner){
this.date = new Date();
this.actions = actions;
this.approved = approved;
this.feedbackitem = new FeedBackItem(feedback, owner);
}
}
@OneToMany(cascade = CascadeType.PERSIST)
private List<Proposal> proposals;
表示Proposal实体与Group一起持久化,但不合并。在分配和持久化 Group 实体之前,应单独持久化其他实体。我会尝试删除此级联属性,并检查问题是否仍然存在。