|
|||||||
DataManager
Время создания: 11.09.2019 13:23
Раздел: INFO - Development - CUBA
Запись: wwwlir/Tetra/master/base/1568179381267o3mxuwg/text.html на raw.githubusercontent.com
|
|||||||
|
|||||||
import com.groupstp.rtneo.entity.* import com.haulmont.cuba.core.global.*; DataManager dataManager = AppBeans.get(DataManager.NAME) def contract = dataManager.load(Contract.class).id(UUID.fromString("${id}")).view(getView).optional().orElse(null) List<RealEstateRenter> realEstateRenter = dataManager.load(RealEstateRenter) .query('select a from rtneo$RealEstateRenter a where a.renterRecord.id = :cr and a.payOwner = true') .parameter("cr", position.getContragentRealEstate().getId()) .view('realEstateRenter-edit') .list() dataManager.load(Book.class).id(bookId).view("book.edit").one(); ************************************************************************ ************************************************************************ ************************************************************************ Интерфейс 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 загружает все локальные атрибуты и представление определяет только загрузку связей:
|
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|