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

Программисты 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Java - collections.remove () vs iterator.remove () с точки зрения производительности
    Anonymous » » в форуме JAVA
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Collections.remove () vs iterator.remove () с точки зрения производительности
    Anonymous » » в форуме JAVA
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Collections.remove () vs iterator.remove () с точки зрения производительности
    Anonymous » » в форуме JAVA
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Когда использовать EntityManager.find() и EntityManager.getReference() с JPA
    Anonymous » » в форуме JAVA
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • EntityManager.persist() не работает с @Transactional
    Anonymous » » в форуме JAVA
    0 Ответы
    49 Просмотры
    Последнее сообщение Anonymous

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