2012-02-26 76 views
4

在J2SE應用程序中使用JPA(OpenJPA)我試圖用條目列表的內容更新表:添加新條目或使用列表中的內容替換現有條目(如果它們存在)。JPA EntityExistsException執行合併時重複條目?

1)什麼是最好的方法來做到這一點?

對於我想執行數百合並在同一事務中...(有的在列表中的條目可能是張玉峯,具有相同的ID)

似乎使用HSQLDB時,做工精細,但是當使用MySQL作爲數據庫時,我得到這個異常: org.apache.openjpa.persistence.EntityExistsException:重複條目

2)任何想法爲什麼?

的代碼很簡單,這樣的事情:

EntityManager em = emfactory.createEntityManager(); 
em.getTransaction().begin(); 

// update messages 
for (Message msg : messages) { 
    Entry e=new Entry(msg.getId(), msg.getText(),msg.getDate()); 
    em.merge(e); 
} 

em.getTransaction().commit(); 
em.close(); 

感謝

+0

我猜異常快到形式提交的生成策略。如果是這樣,你可以嘗試解決這個問題並找到導致問題的味精。在合併下的for中移動提交。用try/catch包圍提交併在catch中設置一個斷點。另外,Message實體中的唯一字段是什麼? – AR3Y35 2012-05-18 08:46:10

回答

0

做一個堅持如果實體未設置,合併,否則......

這很適合我用H2/HSQL/MySQL,這是em.contains()中的魔術,它檢查實體是否連接到當前事務中。

在下面的例子中,e.id具有AUTO

if (e.getId() == null || e.getId() == 0) { 
    em.persist(e); 
    if (e.getId() == null || e.getId() == 0) { 
     return null; //Or whatever you want to show that the persist failed 
    } 
} else { 
    if (!em.contains(e)) { 
     return em.merge(e); 
    } 
}