Дано below пример <p:dataTable>
с использованием ленивой модели данных PrimeFaces. Поле версии строки, помеченное как @javax.persistence.Version
в ассоциированном объекте JPA, временно отображается в одном из столбцов в режиме только для чтения.p: dataTable и оптимистичная блокировка в JPA
Нет необходимости упомянуть, что каждое действие является Ajaxical.
Редактирование этого <p:dataTable>
использованием <p:rowEditor/>
как follows (первая строка в таблице. версия строка 1).
Когда строка редактируется обновляется, нажав на галочку в Edit колонке, как описано выше, версия строки увеличивается в базе данных до 2 об успешном обновлении, но версия строки принадлежат таблицы данных по-прежнему 1 (см. рисунок ниже). После завершения обновления статус таблицы данных можно просмотреть как follows.
Что происходит сейчас, если та же строка снова пытался (без перезагрузки страницы, отправив запрос на синхронную GET), то она не будет соответствовать версии строки в базе данных, которая в настоящее время 2, так как таблица данных по-прежнему поставляет прежнее предыдущее значение версии, которое равно 1. Это приведет к тому, что javax.persistence.OptimisticLockException
будет выбрасываться, как если бы обнаружены параллельные обновления, что, очевидно, неверно.
Что-то, возможно, потребуется изменить коренным образом в обычном Ajaxical объекта обновления, предоставляемом <p:dataTable>
(с использованием <p:rowEditor/>
) для того, чтобы правильно и синхронно работать с оптимистической стратегией блокировки в JPA.
Что было бы правильным способом обойти ситуацию? Отбросить <p:rowEditor/>
полностью потребует огромных изменений в существующих приложениях, кстати, что совершенно нежелательно.
Другими словами, объект в ленивой модели данных не обновляется после вызова службы? Изменения не отражаются в этом объекте? – BalusC
Да, модель, поддерживаемая '', не обновляется, если что-то было изменено за спиной, что приводит к тому, что старые/устаревшие значения будут предоставлены при последующих попытках обновить одну и ту же таблицу таблиц данных, если сама таблица не будет перезагружена обновлением например, на текущей странице. –
Tiny
Я бы сказал, что обновление модели - это нечто **, которое вы должны сделать. PFdatatable может и не должен знать, что там изменилось. Это может быть, например, что многие другие записи будут обновлены, как хорошо. Одна из причин этого может заключаться в том, что объект в datamodel стал отсоединенным, и перед его обновлением вы его слейте. Вы должны заменить отдельный объект в datamodel на объединенный, а не что-то, что PF может или должен делать. <...> – Kukeltje