在唯一约束异常后保存实体

时间:2014-04-27 16:16:50

标签: java jpa version unique openjpa

我有一个具有唯一名称的实体。

在我的例子中,我保存了两个同名的人。第二次出现了一个" EntityExists" (唯一)例外,这是预期的行为。

之后我改名并设置" ID"为空。 比我尝试再次坚持它但我得到" org.apache.openjpa.persistence.EntityExistsException:尝试保留分离的对象" com.Person@1117a20"。如果这是一个新实例,请确保持久化时任何版本和/或自动生成的主键字段为空/默认。
没有它的工作版本,但我找不到解决方案"重置"版本号。

有人可以帮助我吗?

更新:我的新问题是,我有一个基本实体两个pcVersionInit(在底部查看我的答案)我无法覆盖它,我尝试在基础和正常实体现在最好的做法是什么,而不是"覆盖" pcVersionInit中的值?复制构造函数?"

public class Starter{
private static EntityManager em;

public static void main(String[] args) {
    em = Persistence.createEntityManagerFactory("openjpa")
            .createEntityManager();
    Person p1 = new Person("TEST");
    savePerson(p1);
    Person p2 = null;
    try{
        p2 = new Person("TEST");
        savePerson(p2);
    }catch(Exception e){
        p2.setId(null);
        p2.setName(p2.getName()+"2");
        em.persist(p2);
    }

}


private static void savePerson(Person person){
    em.getTransaction().begin();
    em.persist(person); 
    em.getTransaction().commit();   
}
}

Person.class:

@Entity
public class Person implements Serializable{

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="seqGenerator")
@SequenceGenerator(name="seqGenerator",sequenceName="personSeq")
private Long id;

@Version
private Long version;

@Column(nullable=true, unique=true)
private String name;

public Person(String name) {
    this.name = name;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Long getVersion() {
    return version;
}

public void setVersion(Long version) {
    this.version = version;
}    
}

2 个答案:

答案 0 :(得分:2)

首先,远离乱搞pcVersionInit。我建议在Person Entity中创建一个复制构造函数,如果是回滚,则使用复制构造函数创建一个新的构造函数。

答案 1 :(得分:0)

好的问题是,OpenJPA添加了一个名为pcVersionInit的字段(带有@version)并将其设置为" true"在尝试坚持之后。如果我使用反射将其设置为false,则它可以正常工作。其他方式是复制构造函数。

相关问题