РЕДАКТИРОВАТЬ
Очевидным решением является блокировка объекта (т. Е. Строки) при загрузке его для привязки формы.Это гарантирует, что запрос на владение блокировкой будет читать / связывать / записывать чисто, без одновременной записи в фоновом режиме.Это не идеально, поэтому вам нужно взвесить потенциальные проблемы с производительностью (уровень одновременных записей).
Помимо этого, при условии, что вы довольны «победами при последней записи» в подгруппах свойств,тогда «dynamicUpdate» в Hibernate кажется наиболее разумным решением, если только вы не подумаете о переключении ORM в ближайшее время.Я нахожу странным, что JPA, по-видимому, не предлагает ничего, что позволяет вам только обновлять грязные поля, и нахожу вероятным, что это произойдет в будущем.
Дополнительно (мой оригинальный ответ)
Ортогонально тому, как убедиться, что транзакция открыта, когда ваша Модель загружает сущность для привязки формы.Опасность заключается в том, что свойства сущностей обновляются в этой точке и вне транзакции, что оставляет сущность JPA в неопределенном состоянии.
Очевидный ответ, как говорит Адриан в своем комментарии, заключается в использовании традиционной транзакции:фильтр по запросу.Это гарантирует, что все операции в запросе происходят в одной транзакции.Однако определенно будет использовать подключение к БД при каждом запросе.
Существует более элегантное решение с кодом здесь .Техника заключается в том, чтобы лениво создавать экземпляр управления данными и начинать транзакцию только тогда, когда это необходимо (т.е. когда происходит первый вызов EntityModel.getObject ()).Если есть транзакция, открытая в конце цикла запроса, она фиксируется.Преимущество этого состоит в том, что никогда не бывает потраченных впустую соединений с БД.
Данная реализация использует объект wicket RequestCycle (обратите внимание, что это немного отличается в v1.5 и более поздних версиях), но вся реализация на самом деле довольно общаяТаким образом, и вы можете использовать его (например) без калитки через фильтр сервлета.