2013-12-05 2 views
0

Я новичок в Spring, мое приложение, разработанное Spring Spring, имеет Cron, который каждый день загружает некоторые файлы и обновляет базу данных.Двойные экземпляры в базе данных после использования EntityManager.merge() в методе переходных процессов

Обновление выполняется после загрузки и разбора файлов, используя слияния(), класса сущностей Dataset имеет список под названием ресурсов, после загрузки я делаю:

dataset.setResources(resources); 
dataset.merge(); 

и dataset.merge() выполняет следующие действия:

@Transactional 
public Dataset Dataset.merge() { 
    if (this.entityManager == null) this.entityManager = entityManager(); 
    Dataset merged = this.entityManager.merge(this); 
    this.entityManager.flush(); 
    return merged; 
} 

Я ожидаю, что сделаю dataset.setResources (resources); Я бы перезаписал поданные ресурсы, и поэтому даже запись в базе данных была бы перезаписана.

Но я получаю двойные записи в базе данных: каждый ресурс появляется дважды, с разными идентификаторами (инкрементный).

Как я могу добиться, чтобы мое приложение выполняло обновления и не вставляло их? Наивное решение было бы удалить вручную старый ресурс, а затем вызвать merge(); это способ или есть еще более умное решение?

ответ

0

Эта ситуация возникает, когда вы используете Hibernate как механизм персистентности, а ваши объекты имеют поле версии.

Обычно поле идентификатора - это то, что нам нужно для слияния отдельного объекта с его постоянным состоянием в базе данных, но Hibernate берет поле версии в учетной записи и если вы его не устанавливаете (оно равно null) Hibernate отбрасывает значение поля ID и создает новый объект с новым идентификатором.

Чтобы узнать, зависит ли вас от этой странной функции Hibernate, установите значение в поле версии, если вы выбрали Exception, вы получили его. В этом случае лучший способ решить эту проблему - данные для синтаксического анализа содержат правильное значение версии. Еще один способ - отключить проверку версий (см. Руководство по Hibernate, чтобы узнать об этом) или загрузить постоянное состояние перед слиянием.

 Смежные вопросы

  • Нет связанных вопросов^_^