我有一个具有唯一名称的实体。
在我的示例中,我保存了两个同名的人。第二次出现“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();
}
}
人物类别:
@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;
}
}
最佳答案
首先,不要乱搞 pcVersionInit。我建议在您的 Person 实体中创建一个复制构造函数,并在回滚时使用复制构造函数创建一个新的构造函数。
关于java - 唯一约束异常后保存实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23325760/