Ошибка дублирующейся записи JPA в EntityManager.remove, а затем в EntityManager.persist ⇐ JAVA

Программисты JAVA общаются здесь
Anonymous
Ошибка дублирующейся записи JPA в EntityManager.remove, а затем в EntityManager.persist

Сообщение Anonymous »

Я использую реализацию JPA в Hibernate. Допустим, у меня есть список объектов, которые мне нужно сохранить в таблице Event. Все эти объекты имеют один и тот же почтовый индекс.

Код: Выделить всё

public class Event {
String id;
String zipCode;
String locationCode;
String eventName;
String eventDesc;
}
Здесь id — это первичный ключ, а zipCode и locationCode вместе составляют уникальный ключ (UK_zipCode_locationCode). Возможно, в таблице уже есть объекты с данным почтовым индексом. Поэтому вместо того, чтобы искать, какие из них следует добавить, удалить или обновить, я сначала удаляю все объекты в таблице с заданным почтовым индексом, а затем вставляю все заданные объекты.

Код: Выделить всё

// getEventsToAdd method returns the list of events to be added for the zipCode 1234
// getEventsFromTheDB method returns all the events in the db with the zipCode 1234

List eventsToAdd = getEventsToAdd("1234");
List oldEvents = getEventsFromTheDB("1234");

for (Event e : oldEvents) {
entityManager.remove(e);
}

for (Event e : eventsToAdd) {
entityManager.persist(e);
}
entityManager.flush();
// ...
Это работает, когда список oldEvents пуст или когда все объекты в oldEvents также находятся в списке eventToAdd (под этим я подразумеваю событие объекты с тем же идентификатором и одинаковым почтовым индексом).
Однако, если в oldEvents есть некоторые объекты событий, которые имеют другой идентификатор, т. е. не совпадают с идентификатором любой объект в списке eventToAdd, то выдается исключение

Код: Выделить всё

Duplicate Entry found for key UK_zipCode_locationCode
Ошибка заключается в том, что старые события не были удалены из таблицы, и теперь вставка событий с теми же значениями zipCode и locationCode вызывает org.hibernate.Exception.ConstraintViolationException.
Однако, если я вызовуentityManager.flush() после удаления старых событий, это сработает -

Код: Выделить всё

// This works!

for (Event e : oldEvents) {
entityManager.remove(customizedProviderAttribute);
}
// flush after removing all the old events
entityManager.flush();
for (Event e : eventsToAdd) {
entityManager.persist(e);
}
Итак, почему очистка в конце не работает, а очистка после удаления старых объектов работает?

Подробнее здесь: https://stackoverflow.com/questions/720 ... er-persist

Вернуться в «JAVA»