gpt4 book ai didi

java - 在填充的数据库中使用 @GenerateValue(strategy=GenerationType.IDENTITY) 会导致 PK 约束错误

转载 作者:行者123 更新时间:2023-12-02 13:18:08 25 4
gpt4 key购买 nike

我正在尝试将 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。

下面是我试图保存到数据库的类:

@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(){

}
}

我在没有 @GenerateValue(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;

表示提案实体与组一起持久保存,但不合并。在分配和持久化 Group 实体之前,应单独持久化其他实体。我会尝试删除此级联属性,并检查问题是否仍然存在。

关于java - 在填充的数据库中使用 @GenerateValue(strategy=GenerationType.IDENTITY) 会导致 PK 约束错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43701486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com