我正在尝试将FeedbackItem
项添加到我的数据库中。一般的想法是类型Group
的现有对象可以接收多个FeedbackItem
对象。之后我更新了对象:
groupDAO.startTransaction();
groupDAO.update(selectedGroup);
groupDAO.commitTransaction();
//in groupDAO
public T update(T entity){
return em.merge(entity);
}
我不确定JPA是否导致问题,但会出现以下错误:
内部异常:java.sql.SQLIntegrityConstraintViolationException:语句已中止,因为它会在唯一或主键约束或由'FEEDBACKITEM'上定义的'SQL170430012202680'标识的唯一索引中导致重复键值。
经过一些调试后,我发现了以下条目:
[EL Fine]:sql:2017-04-30 01:22:14.977-- #### VALUES(?,?)bind => [sampleText,2]
[EL精细]:sql:2017-04-30 01:22:14.997 - ClientSession的(889348271) - 线程(线程[JavaFX的 应用程序线程,5,主要]) - VALUES(1)
VALUES(1)
是否意味着它试图在ID 1下插入对象?这是我目前唯一的领先优势。我的数据库填充了10个条目,ID为1到10。
以下是我试图保留到数据库的类:
@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);
}
}
答案 0 :(得分:1)
@OneToMany(cascade = CascadeType.PERSIST)
private List<Proposal> proposals;
表示Proposal实体与Group一起持久化,但未合并。在分配和持久化Group实体之前,应单独保留其他实体。我会尝试删除此级联属性,并检查问题是否仍然存在。