我有一个具有唯一名称的实体。
在我的例子中,我保存了两个同名的人。第二次出现了一个" 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;
}
}
答案 0 :(得分:2)
首先,远离乱搞pcVersionInit。我建议在Person Entity中创建一个复制构造函数,如果是回滚,则使用复制构造函数创建一个新的构造函数。
答案 1 :(得分:0)
好的问题是,OpenJPA添加了一个名为pcVersionInit的字段(带有@version)并将其设置为" true"在尝试坚持之后。如果我使用反射将其设置为false,则它可以正常工作。其他方式是复制构造函数。