使用JPA向表添加新实例

时间:2013-01-24 09:45:24

标签: java database jpa eclipselink derby

我使用以下代码,当我从表中读取条目时(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]   到数据库中的主键列。不允许更新。

1 个答案:

答案 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();