JPA / EclipseLink: выберите перед обновлением — изменения без перезаписи с оптимистичной блокировкой

#jpa #eclipselink #optimistic-locking

#jpa #eclipselink #оптимистичная блокировка

Вопрос:

Я использую JPA / EclipseLink в своем проекте для большинства обновлений, но некоторые массовые обновления в БД должны изменять данные в фоновом режиме. Пользователь не должен получать исключение с оптимистичной блокировкой, если данные изменяются в фоновом режиме при редактировании некоторых данных. Таким образом, массовое обновление не обновляет поле версии.

Если я загружаю объект, чтобы отобразить его пользователю, и сохраняю его после обновления, изменения, внесенные в mass update, перезаписываются. EclipseLink не только обновляет значения, измененные пользователем, но и выбирает перед обновлением, а также изменяет поля, которые были изменены массовым обновлением между загрузкой и объединением объекта.

Есть ли возможность обновлять только поля, которые были изменены пользователем, и игнорировать другие поля, обновленные массовым обновлением?

Комментарии:

1. Как предполагается, что Eclipselink угадывает намерения пользователя (т. Е. Оставляет свойство нетронутым или устанавливает для него новое значение, которое просто совпадает с некоторым старым значением некоторое время назад)? Если вы отслеживаете действия пользователя (т. Е. Какие поля Были изменены), вам следует исправить объект вместо полного включения merge . Просто извлеките объект, id обновив только те поля, которые были затронуты пользователем

2. EclipseLink, конечно, только вносит только изменения и использует отслеживание изменений, но для этого требуется, чтобы вы прочитали объект из контекста EntityManager и использовали этот экземпляр для своих изменений. Если вы сериализуете его в любом месте (т.Е. rest), где вам нужно будет использовать вызов слияния, это не сработает: контракт JPA на слияние заключается в том, что то, что вы передаете, перезаписывает данные в этом контексте, и, вероятно, это то, что вы видите — он считывает последние данные для управляемого экземпляраи перезаписывает данные из вашего экземпляра. Отслеживание изменений с помощью ткачества может помочь, но это будет зависеть от механизма сериализации.