在填充的数据库中使用 @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 实体之前,应单独持久化其他实体。我会尝试删除此级联属性,并检查问题是否仍然存在。