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

时间:2017-04-29 23:37:29

标签: java jpa eclipselink

我正在尝试将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);
    }
}

1 个答案:

答案 0 :(得分:1)

@OneToMany(cascade = CascadeType.PERSIST) 
private List<Proposal> proposals;

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