JPA EntityExistsException合并时重复条目?

时间:2012-02-26 11:59:56

标签: mysql jpa transactions merge

在J2SE应用程序中使用JPA(OpenJPA)我正在尝试使用条目列表的内容更新表:添加新条目或用列表中的内容替换现有条目(如果它们存在)。

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();

感谢

1 个答案:

答案 0 :(得分: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);
    }
}