2013-01-24 39 views
1

添加新的实例到表使用下面的代码,当我从表中读取条目(derby db - eclipse链接) 只有一个条目,我应该如何添加新条目?例如添加相同的条目5次?使用JPA

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依然存在,在第二循环中改变的id值,我得到了以下错误:

异常说明:将[DerbyModel.Person] 类的属性[id]映射到数据库中的主键列。更新不是允许的 。 javax.persistence.RollbackException异常[EclipseLink-7251] (Eclipse持久性服务 - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.ValidationException异常 说明:属性[DerbyModel.Person]类的[id]被映射为 到数据库中的主键列。更新是不允许的。

+1

你坚持什么实体?向我们展示实体类。你在哪里填充你的'listClsObj'? –

+0

你一直坚持着同一个对象(5次) - 这真的是你想要的吗? –

+0

是的,我需要建立虚拟数据 –

回答

1

当调用em.persist(object),由object所指向的实例可能分配一个id由DBMS,并保持连接到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(); 
+0

我试图改变id值,并得到错误任何想法如何克服这一点?我用这个详细信息更新我的问题 –

+0

在尝试重置密钥('em.detach(object)')之前,您是否尝试过从会话中分离对象?你也可以在这个问题中找到有用的答案:[复制实体集合并坚持在Hibernate/JPA](http://stackoverflow.com/q/1973877/851811) –

+0

我应该怎么做?因为我不使用会话代码 –