2012-02-26 40 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); 
    } 
}