我使用以下代码,当我从表中读取条目时(derby db - eclipse链接) 只有一个条目,我应该如何添加新条目?例如,添加相同的条目5次?
for (Object object : listClsObj) {
int cnt = 1;
do {
em.getTransaction().begin();
em.persist(object);
em.getTransaction().commit();
cnt++;
}
while (cnt < 6);
}
em.close();
实体类是:
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private String id;
private String firstName;
private String lastName;
public String getId() {
return id;
}
public void setId(String Id) {
this.id = Id;
}
public String getFirstName() {
return firstName;
}
当我将断点放在em persist并且在第二个循环中更改id值时,我得到以下错误:
异常描述:类[DerbyModel.Person]的属性[id] 映射到数据库中的主键列。更新不是 允许。线程“main”中的异常 javax.persistence.RollbackException:异常[EclipseLink-7251] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.ValidationException异常 描述:映射类[DerbyModel.Person]的属性[id] 到数据库中的主键列。不允许更新。
答案 0 :(得分:1)
调用em.persist(object)
时,object
引用的实例可能由dbms分配id
,并保持附加到jpa会话。这意味着object
引用的实例已经被持久化,并且对persist
的后续调用除了尝试再次持久化之外不会做任何事情(相同的id,相同的值)。
您可能需要在每次执行循环时创建Person
的新实例,并保留每一个实例,或者尝试分离实例(例如通过em.detach()
)并重置其ID。
未经测试的样本:
for (Object object : listClsObj) {
int cnt = 1;
do {
em.getTransaction().begin();
em.persist(object);
em.getTransaction().commit();
em.detach(object);
((Person)object).setId(null);
cnt++;
}
while (cnt < 6);
}
em.close();