Java 在填充的数据库中使用@GeneratedValue(strategy=GenerationType.IDENTITY)会导致PK约束错误
我正在尝试将Java 在填充的数据库中使用@GeneratedValue(strategy=GenerationType.IDENTITY)会导致PK约束错误,java,jpa,eclipselink,Java,Jpa,Eclipselink,我正在尝试将FeedbackItem项添加到我的数据库中。一般的想法是,组类型的现有对象可以接收多个反馈项对象。之后,我更新对象: groupDAO.startTransaction(); groupDAO.update(selectedGroup); groupDAO.commitTransaction(); //in groupDAO public T update(T entity){ return em.merge(entity); } 我不确定是否是JPA导致了问题,但会出现
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-#########值(?,)绑定=>
[样本文本,2]
[EL Fine]:sql:2017-04-30
01:22:14.997--客户端会话(889348271)--线程(线程[JavaFX
应用程序线程,5,主]——值(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。这样做没有任何问题
编辑:下面是组
实体:
@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() {
}
}
@OneToMany(cascade=CascadeType.PERSIST)
私人名单建议;
表示提案实体与组一起保留,但不合并。在分配和持久化组实体之前,应分别持久化其他实体。我将尝试删除这个级联属性,并检查问题是否仍然存在
groupDAO.update()。我将代码添加到问题中。@Tumladhir为组实体粘贴代码。您是如何在数据库中填充这10项的,以及如何设置标识序列的?设置了什么数据库和数据库平台?在受支持的平台上使用identity时,EclipseLink不会传入ID的值,因此可能是它设置不正确,或者您传入的实体已经设置了值。日志记录应显示正在使用的完整SQL,包括为导致错误的语句传入的值列表,以便您可以检查有问题的值是如何分配的,或者您是否传入了具有此值的实体,并且没有正确地对其调用merge。项是使用insert-into
语句插入的。我没有设置任何显式标识序列。我正在使用JDBCDerby和EclipseLink JPA2.1。日志文件中的查询(在应用程序中工作时尝试保留新对象)如下:插入FEEDBACKITEM(FEEDBACK,OWNER\u USERID)值(?,)
,其中值由[feedbacktext,2]绑定。我认为这句话没有错。id字段应该由JPA标识填充?我添加了集团实体和提案实体的代码。该组还包含使用相同类型反馈项的其他对象,这些对象在过程中没有更改。这会导致冲突吗?@Tumladhir-answer-replacedYou关于级联类型的看法确实正确。我把它拿走了。但是,它仍然显示相同的错误。我尝试创建一个提案并手动持久化它,在反馈项上使用级联持久化(因为创建提案时它也是一个新对象)。它仍然在坚持这一点FeedbackItem@Tumladhir,反馈项也是新的还是现有的?若存在,则无法在其上级联持久化。@Tumladhir DB表应生成下一个id。请尝试插入(使用本机SQL)id为空的记录,以检查表是否正确生成下一个id。如果不是,我想主键的设置是错误的。
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;