JPA EntityExistsException Повторяющаяся запись при выполнении слияния? - PullRequest
4 голосов
/ 26 февраля 2012

Использование JPA (OpenJPA) в приложении J2SE Я пытаюсь обновить таблицу с содержимым списка записей: добавление новых записей или замена существующих записей тем, что находится в списке, если они существуют.

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 голосов
/ 15 апреля 2014

Сохранить, если сущность не установлена, в противном случае объединить ...

Это сработало для меня с 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);
    }
}
...