Здравствуйте, нужно реализовать версионность таким образом: имеется карточка компании с различными связями (скриншот прилагается), планируется сделать так, чтобы при каждом изменении любого поля сохранялась версия и затем все эти версии были доступны в формате как на скриншоте, только все поля нередактируемые, что-то типо картинки. Знаю что есть встроенный механизм снапшотов, возможно ли с помощью него реализовать такой функционал, если да, то можете подсказать как?
Добрый день,
Да, это можно реализовать.
В мануале есть определенная информация: https://doc.cuba-platform.com/manual-7.2-ru/entity_snapshots_save.html
Возможности механизма снимков немножко шире, чем там расписано. Посмотрите также на методы сервиса com.haulmont.cuba.core.app.EntitySnapshotService
- Для сохранения снимка нужно вызывать метод createSnapshot()
- Для получения списка снимков данной сущности - getSnapshots()
- Потом из снимка можно получить саму сущность - extractEntity()
За сущностью может быть большой граф дочерних под-объектов, глубина сохранения определяется параметром view.
Полученную из extract() сущность можно подставить в экран, и поля экрана начнут отображать исторические данные. Можно попробовать подставлять исторический снимок прямо в основной экран редактора, а можно написать отдельный экран для отображения исторического снимка.
Имейте ввиду, что снимки хранятся в БД в json виде, поэтому они довольно прожорливы по дисковому пространству.
Спасибо большое, попробуем это реализовать.
Почему то всегда открывается последняя версия, а не историческая.
Вот так я сохраняю:
Вот так достаю и открываю:
Да, это ожидаемо. StandardEditor для не-новых переданных в него сущностей берет только ID, и перезагружает сущность с view, указанной в редакторе.
Логика здесь: com.haulmont.cuba.gui.screen.StandardEditor#setupEntityToEdit (ветка else).
Попробуйте сделать в редакторе публичный метод, который будет проставлять сущность-снимок в instance container редактора - monitoringCardDc.setItem(snapshot)
. И вызывать этот метод на экране после show().
Думал как раз о том, что дело в StandartEditor и так же делал публичный метод и подставлял в него историческую сущность, но до show() и не работало. Теперь, подставив после show(), все работает, спасибо.