|
|||||||
Документация DataManager
Время создания: 02.10.2019 08:57
Раздел: INFO - Development - CUBA
Запись: wwwlir/Tetra/master/base/1569977827geilwrda91/text.html на raw.githubusercontent.com
|
|||||||
|
|||||||
Интерфейс DataManager является универсальным средством для загрузки графов сущностей из базы данных, и для сохранения изменений, произведенных в detached экземплярах сущностей.
DataManager на самом деле делегирует выполнение реализациям DataStore , и поддерживает ссылки между сущностями из разных хранилищ. Большинство деталей реализации, описанных ниже, актуальны только когда производится работа через RdbmsStore с сущностями, хранящимися в реляционной БД. Для другого типа хранилища все, кроме сигнатур методов, может отличаться. Для простоты изложения, далее, когда мы говорим просто DataManager, мы будем иметь в виду DataManager через RdbmsStore. Методы DataManager:
@Inject
private DataManager dataManager;
private Book loadBookById(UUID bookId) {
return dataManager.load(Book.class).id(bookId).view("book.edit").one();
}
private List<BookPublication> loadBookPublications(UUID bookId) {
return dataManager.load(BookPublication.class)
.query("select p from library$BookPublication p where p.book.id = :bookId")
.parameter("bookId", bookId)
.view("bookPublication.full")
.list();
}
List<KeyValueEntity> list = dataManager.loadValues(
"select o.customer, sum(o.amount) from demo$Order o " +
"where o.date >= :date group by o.customer")
.properties("customer", "sum")
.parameter("date", orderDate)
.list();
BigDecimal sum = dataManager.loadValue(
"select sum(o.amount) from demo$Order o " +
"where o.date >= :date group by o.customer", BigDecimal.class)
.parameter("date", orderDate)
.one();
@Inject
private DataManager dataManager;
private Book loadBookById(UUID bookId) {
LoadContext<Book> loadContext = LoadContext.create(Book.class)
.setId(bookId).setView("book.edit");
return dataManager.load(loadContext);
}
private List<BookPublication> loadBookPublications(UUID bookId) {
LoadContext<BookPublication> loadContext = LoadContext.create(BookPublication.class)
.setQuery(LoadContext.createQuery("select p from library$BookPublication p where p.book.id = :bookId")
.setParameter("bookId", bookId))
.setView("bookPublication.full");
return dataManager.loadList(loadContext);
}
ValueLoadContext context = ValueLoadContext.create()
.setQuery(ValueLoadContext.createQuery(
"select o.customer, sum(o.amount) from demo$Order o " +
"where o.date >= :date group by o.customer")
.setParameter("date", orderDate))
.addProperty("customer")
.addProperty("sum");
List<KeyValueEntity> list = dataManager.loadValues(context);
Метод возвращает набор экземпляров сущностей, возвращенных из метода EntityManager .merge(), то есть по сути свежие экземпляры, только что обновленные в БД. Дальнейшая работа должна производиться именно с этими возвращенными экземплярами, чтобы предотвратить потерю данных или исключения оптимистичной блокировки. Для того, чтобы обеспечить наличие нужных атрибутов у возвращенных сущностей, с помощью мэп CommitContext.getViews() можно указать представление для каждого сохраняемого экземпляра. Примеры сохранения коллекций сущностей: @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.addInstanceToCommit(bookInstance, view);
}
return dataManager.commit(commitContext);
}
Например, если вы создаете экземпляр сущности User, вам необходимо установить ссылку на Group, в которую данный пользователь будет входить. Если вам известен id группы, то вы могли бы загрузить данную группу из БД. Данный метод позволяет получить экземпляр Group без ненужного обращения к БД: user.setGroup(dataManager.getReference(Group.class, groupId));
dataManager.commit(user);
Ссылка может также быть использована для удаления существующего объекта по идентификатору: dataManager.remove(dataManager.getReference(Customer.class, customerId));
Правила создания запросов аналогичны описанным в разделе Выполнение JPQL-запросов . Отличием является то, что в запросе, выполняемом через DataManager, могут быть использованы только именованные параметры, позиционные не поддерживаются. DataManager всегда стартует новую транзакцию и по завершении работы выполняет коммит, таким образом возвращая сущности в detached состоянии . Частичная сущность - это экземпляр сущности, в котором может быть загружена только часть локальных атрибутов. По умолчанию, DataManager загружает частичные сущности в соответствии с указанными представлениями . (на самом деле, RdbmsStore просто устанавливает свойство loadPartialEntities у представления в true и передает его дальше в EntityManager ). В некоторых случаях DataManager загружает все локальные атрибуты и представление определяет только загрузку связей:
|
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|