Интерфейс DataManager
является универсальным средством для загрузки графов сущностей из
базы данных, и для сохранения изменений, произведенных в detached экземплярах сущностей.
DataManager
всегда стартует новую транзакцию и по завершении работы выполняет коммит, таким
образом возвращая сущности в detached состоянии.
Методы DataManager
:
-
load()
,loadList()
- загружает граф сущностей в соответствии с параметрами переданного объектаLoadContext
.В
LoadContext
обязательно должен быть передан либо JPQL-запрос, либо идентификатор сущности. Если передано и то и другое, используется запрос, а идентификатор игнорируется.Правила создания запросов аналогичны описанным в Раздел 4.4.4.4, «Выполнение JPQL запросов». Отличием является то, что в запросе
LoadContext
могут быть использованы только именованные параметры, позиционные не поддерживаются.Методы
load()
иloadList()
проверяют наличие у пользователя праваEntityOp.READ
на загружаемую сущность. Кроме того, при извлечении сущностей из БД накладываются ограничения групп доступа. Для отмены действия ограничений в текущем запросе можно передать вLoadContext
атрибутuseSecurityConstraints = false
.Примеры загрузки сущностей в контроллере экрана:
@Inject private DataManager dataManager; private Book loadBookById(UUID bookId) { LoadContext loadContext = new LoadContext(Book.class) .setId(bookId).setView("book.edit"); return dataManager.load(loadContext); } private List<BookPublication> loadBookPublications(UUID bookId) { LoadContext loadContext = new LoadContext(BookPublication.class) .setView("bookPublication.full"); loadContext.setQueryString("select p from library$BookPublication p where p.book.id = :bookId") .setParameter("bookId", bookId); return dataManager.loadList(loadContext); }
-
commit()
- сохраняет в базе данных набор сущностей, переданный в объектеCommitContext
. Отдельно указываются коллекции сущностей, которые нужно сохранить, и которые нужно удалить.Метод возвращает набор экземпляров сущностей, возвращенных из метода EntityManager.merge(), то есть по сути свежие экземпляры, только что обновленные в БД. Дальнейшая работа должна производиться именно с этими возвращенными экземплярами, чтобы предотвратить потерю данных или исключения оптимистичной блокировки. Для того, чтобы обеспечить наличие нужных атрибутов у возвращенных сущностей, с помощью мэп
CommitContext.getViews()
можно указать представление для каждого сохраняемого экземпляра.Метод
commit()
проверяет наличие у пользователя праваEntityOp.UPDATE
на изменяемые сущности, иEntityOp.DELETE
на удаляемые.Примеры сохранения коллекций сущностей:
@Inject private DataManager dataManager; private void saveBookInstances(List<BookInstance> toSave, List<BookInstance> toDelete) { CommitContext commitContext = new CommitContext(toSave, toDelete); dataManager.commit(commitContext); } private Set<Entity> saveAndReturnBookInstances(List<BookInstance> toSave, View view) { CommitContext commitContext = new CommitContext(); for (BookInstance bookInstance : toSave) { commitContext.getCommitInstances().add(bookInstance); commitContext.getViews().put(bookInstance, view); } return dataManager.commit(commitContext); }
-
reload()
- удобные методы для перезагрузки экземпляра сущности с требуемым представлением. Делегируют выполнение методуload()
. -
remove()
- удаляет экземпляр сущности из базы данных. Делегируют выполнение методуcommit()
.
В процессе загрузки данных DataManager
может реализовывать дополнительную функциональность,
описанную ниже.