2014-04-27 26 views
1

我有一個具有唯一名稱的實體。在唯一約束例外後保存實體

在我的例子中,我救了兩個同名的人。第二次出現「EntityExists」(唯一)異常,這是預期的行爲。

之後我改變了名稱,並將「ID」設置爲空。 比我試圖堅持下去,但我得到「org.apache.openjpa.persistence.EntityExistsException:嘗試堅持分離對象」[email protected]「。如果這是一個新的實例,請確保任何版本和/或堅持當自動生成主鍵字段爲空/默認
沒有它的工作版本,但我覺得沒有解決「復位」的版本號

有人可以幫助我

更新。?我的新問題是,我有一個基本實體兩個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

首先,遠離搞亂pcVersionInit。我建議在Person Entity中創建一個拷貝構造函數,使用複製構造函數創建一個新的回滾事件。

+0

謝謝你...... :) – pL4Gu33

0

好了,問題是OpenJPA中添加一個字段中指定pcVersionInit(與@version),把它 「?真正的」 後嘗試是否仍然存在。我使用反射將它設置爲false,它的工作原理。其他方式是複製構造函數。

+0

我會小心這樣做,因爲不能保證已經回滾/分離的實體已準備好使用。這聽起來像是在這種情況下起作用,但要警惕空頭。 – Rick

+0

你好,你是對的。現在我遇到了另一個問題。 (我編輯我的答案)現在最好的做法是什麼,而不是「覆蓋」pcVersionInit中的值? – pL4Gu33