#jpa #eclipselink #optimistic-locking
#jpa #eclipselink #оптимистичная блокировка
Вопрос:
Я использую JPA / EclipseLink в своем проекте для большинства обновлений, но некоторые массовые обновления в БД должны изменять данные в фоновом режиме. Пользователь не должен получать исключение с оптимистичной блокировкой, если данные изменяются в фоновом режиме при редактировании некоторых данных. Таким образом, массовое обновление не обновляет поле версии.
Если я загружаю объект, чтобы отобразить его пользователю, и сохраняю его после обновления, изменения, внесенные в mass update, перезаписываются. EclipseLink не только обновляет значения, измененные пользователем, но и выбирает перед обновлением, а также изменяет поля, которые были изменены массовым обновлением между загрузкой и объединением объекта.
Есть ли возможность обновлять только поля, которые были изменены пользователем, и игнорировать другие поля, обновленные массовым обновлением?
Комментарии:
1. Как предполагается, что Eclipselink угадывает намерения пользователя (т. Е. Оставляет свойство нетронутым или устанавливает для него новое значение, которое просто совпадает с некоторым старым значением некоторое время назад)? Если вы отслеживаете действия пользователя (т. Е. Какие поля Были изменены), вам следует исправить объект вместо полного включения
merge
. Просто извлеките объект,id
обновив только те поля, которые были затронуты пользователем2. EclipseLink, конечно, только вносит только изменения и использует отслеживание изменений, но для этого требуется, чтобы вы прочитали объект из контекста EntityManager и использовали этот экземпляр для своих изменений. Если вы сериализуете его в любом месте (т.Е. rest), где вам нужно будет использовать вызов слияния, это не сработает: контракт JPA на слияние заключается в том, что то, что вы передаете, перезаписывает данные в этом контексте, и, вероятно, это то, что вы видите — он считывает последние данные для управляемого экземпляраи перезаписывает данные из вашего экземпляра. Отслеживание изменений с помощью ткачества может помочь, но это будет зависеть от механизма сериализации.