Отложенный коммит данных

Добрый день. В проекте имеется достаточно разветвленный граф сущностей. Т.е. есть корневая сущность, она содержит несколько списков других сущностей, которые, в свою очередь, также имеют ссылки на свои подсущности. Есть отдельный экран, в рамках которого я реализовал специальную логику, которая позволяет точечно менять отдельные значения в объектах на разных уровнях иерархии. Реализован следующий механизм изменения значений. В экране я загружаю корневую сущность по view, содержащему все нужное дерево иерархии. На экране есть поля, не связанные с атрибутами сущностей. При изменениях значений в этих полях я устанавливаю для конкретных объектов, полученных из этой корневой сущности новые значения. После чего все изменения сохраняются автоматом при сохранении формы.

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

Есть ли возможность как-то отслеживать эту ситуацию? Т.е. на момент вызова события закрытия формы быть уверенным, что все ранее инициированные события по точечному изменению атрибутов разных объектов завершились? Может есть какие-то иные предложения или мысли?

Почитал форму. Нашел похожую проблему: EntityChangedEvent генерируется не всегда при одинаковых условиях

Обсуждение закончилось ни чем…

Как у вас аннотирован before commit listener?
Если @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT), то попробуйте поменять на просто @EventListener. Он будет срабатывать также в текущей транзакции, но немного в другой момент, и возможно это имеет значение.

Я привел ссылку, как пример похожей проблемы. В моем случае я сам не обрабатываю коммит данных. Т.е. я изменяю состояния нужных мне атрибутов в рамках общего контекста данных, а фактический коммит осуществляется при закрытии формы базовыми механизмами платформамы. Что в этом случае мне попробовать?

Попробуйте подписаться на DataContext.PreCommitEvent и логгировать изменения в ваших сущностях. В это событие приходят коллекции экземпляров, которые затем сохраняются в БД.

Хорошо попробую. Пока пришлось перейти на сохранение каждого объекта отдельно. Т.е. я определяю какие значения изменились и для соответствующих объектов вызываю dataManager.commit(object).
Насколько данный подход правильный в сравнении с однократным итоговым вызовом dataManager.commit() при закрытии формы?

Разница только в том что ваше сохранение теперь работает в разных транзакциях. При коммите экрана DataContext собирает все изменения и сохраняет их одним вызовом DataManager, то есть в одной транзакции.