【问题标题】:JPA EntityExistsException Duplicate entry when doing merge?JPA EntityExistsException 合并时出现重复条目​​?
【发布时间】:2012-03-16 05:00:14
【问题描述】:

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

谢谢

【问题讨论】:

  • 我猜异常来自提交。如果是这样,您可以尝试进行故障排除并找到导致问题的味精。在合并下的 for 中移动提交。用 try/catch 包围提交,并在 catch 中的某处设置断点。另外,您的 Message 实体中的唯一字段是什么?

标签: mysql jpa transactions merge


【解决方案1】:

如果实体未设置,则执行持久化,否则合并...

这对我来说与 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);
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    相关资源
    最近更新 更多