Spring Web Flow — управление персистентностью (flow managed persistence)

7. Управление персистентностью

7.1. Введение

Большинство приложений получают доступ к данным несколькими способами. Часть изменяемых данных доступны для редактирования несколькими пользователями и, следовательно, требуют поддержку транзакций при доступе к данным. Данные часто преобразуют реляционные наборы данных к объектам в предметной области для обеспечения их обработки в приложении. Web Flow предоставляет «управление персистентностью в потоке», с помощью которой поток может создавать, фиксировать, и закрывать объект персистентости. Web Flow включает обе технологии для работы с объектами персистености — Hibernate и JPA.

Отдельно от управления персистентностью с помощью потока, существует шаблон, который полностью инкапсулирует управление с помощью PersistenceContext внутри сервисного слоя вашего приложения. В этом случае веб-слой не связывается с персистентностью, а работает с совершенно отдельными объектами, которые устанавливаются и возвращаются сервисный слоем приложения. Эта глава сфокусирована на сфокусирована на поточном управлении персистентностью и будет исследовано как и где используется эта функция.

7.2. FlowScoped PersistenceContext

Этот шаблон создает PersistenceContext в области flowScope при старте потока, используя контекст для доступа к данным в ходе выполнения потока, и подтверждает изменения сущностей персистенстности при завершении. Этот шаблон обеспечивает изоляцию промежуточных правок до подтверждения изменений в базе в конце выполнения потока. Этот шаблон часто используется в сочетании с оптимистичной стратегией блокировки (optimistic locking strategy) для защиты целостности данных при параллельном доступе нескольких пользователей. Для поддержки сохранения и перезапуска хода выполнения потока на длительный период времени, необходимо использовать надежное хранилище для состояния потока. Если возможность сохранения и перезапуска не требуется, то достаточно использовать стандартное хранилище на основе HTTP-сессии для хранения состояния потока. В этом случае, истечение срока действия сессии или прерывание до подтверждения изменений может привести к потери произведенных изменений.

Для использования шаблона FlowScoped PersistenceContext вначале необходимо отметить потока как persistence-context:

Далее правильно настроить FlowExecutionListener для доступа к этом шаблону в вашем потоке. При использовании Hibernate — зарегистрировать HibernateFlowExecutionListener. При использовании JPA — JpaFlowExecutionListener.

Для запуска подтверждения изменений по окончанию необходимо указать в end-state атрибут commit:

Вот и всё. Когда ваш поток запускается, слушатель выделит новый EntityManager в flowScope. На этот EntityManager можно получить ссылку в любое время внутри вашего потока используя специальную переменную persistenceContext. Кроме того любой доступ к данным, который происходит с помощью управляемого Spring объекта доступа к данным, использует EntityManager автоматически. Операции доступа к данным такого рода должны быть всегда не транзакционными или быть транзакциями только для чтения, для поддержки изоляции от промежуточных изменений.

7.3. Персистентность, управляемая потоком и подпотоки

Управляемый потоком PersistenceContext автоматически распространяется к подпотокам, предполагая, что подпоток так же имеет доступ к переменной <persistence-context/>. Когда подпоток повторно использует PersistenceContext, созданный родительским потоком, то он игнорирует флаги подтверждения изменений при достижении конечного состояния, таким образом откладывая окончательное решение (подтверждать или нет) его родителя.

Share Button
1026 Total Views 1 Views Today

Добавить комментарий