【问题标题】:Add new Instances to tables using JPA使用 JPA 向表中添加新实例
【发布时间】:2013-01-24 09:45:24
【问题描述】:

我使用以下代码,当我从表中读取条目时(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] 映射到数据库中的主键列。更新不是 允许。线程“主”中的异常 javax.persistence.RollbackException:异常 [EclipseLink-7251] (Eclipse 持久性服务 - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.ValidationException 异常 说明:类[DerbyModel.Person]的属性[id]被映射 到数据库中的主键列。不允许更新。

【问题讨论】:

  • 你坚持什么实体?向我们展示实体类。你在哪里填写你的listClsObj
  • 你一遍又一遍地坚持同一个对象(5次)——这真的是你想要的吗?
  • 是的,我需要在那里构建虚拟数据
  • 您的 listClsObj 是否包含 5 个具有相同名字和姓氏的对象?

标签: java database jpa eclipselink derby


【解决方案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();

【讨论】:

  • 我尝试更改 id 值并得到错误知道如何克服这个问题吗?我用这个细节更新我的问题
  • 在尝试重置密钥 (em.detach(object)) 之前,您是否尝试过从会话中分离对象?您还可以在这个问题中找到有用的答案:Duplicate a collection of entities and persist in Hibernate/JPA
  • 试试em.detach()
  • 谢谢,最后一个问题,我们在这里强制转换硬编码(人)我可以从对象中做到这一点(假设我不知道在 RT 期间的类名
  • 你可以让你的持久化类实现一个接口,为id提供一个getter/setter,或者尝试通过反射找到方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 2021-02-14
相关资源
最近更新 更多