Концепции
В этом разделе объясняются основные концепции, лежащие в основе Динамической модели: виды задействованных сущностей, как определяется и версионируется модель, как изменения применяются во время выполнения, где хранятся данные и какие базы данных поддерживаются.
Статические и динамические сущности
Динамическая модель различает два вида сущностей:
-
Статические сущности — это обычные сущности вашего приложения. Они скомпилированы в Java-классы и доступны в classpath.
-
Динамические сущности определяются во время выполнения в модели и генерируются фреймворком. Они не существуют в исходном коде приложения.
Динамические атрибуты могут быть добавлены как к статическим, так и к динамическим сущностям. Это означает, что вы можете обогащать существующие сущности приложения новыми атрибутами и, независимо от этого, вводить совершенно новые сущности, существующие только в модели времени выполнения.
Определение модели
Динамическая модель — это декларативное описание перечислений, сущностей, атрибутов и экранов. Вы редактируете её графически в административном UI: создаёте сущности, добавляете атрибуты с их типами и ограничениями, определяете перечисления, объявляете экраны и пункты меню.
За кулисами модель сериализуется в YAML. Обычно вы работаете с графическим редактором и не редактируете YAML напрямую, но YAML полезен для просмотра, экспорта и импорта. Полный список элементов, поддерживаемых значений и значений по умолчанию см. в разделе Справочник по YAML.
Версионирование и развёртывание
Определение модели хранится в базе данных в виде набора версионируемых конфигураций. В каждый момент времени активна только одна версия. Хранение предыдущих версий позволяет просматривать изменения с течением времени и откатываться путём активации более ранней версии.
При запуске приложения фреймворк может автоматически применять активную версию, так что работающее приложение отражает последнюю развёрнутую модель. Это поведение управляется свойством jmix.dynmodel.deploy-on-app-start.
Применение изменений
При применении модели фреймворк строит новое поколение метаданных из определения модели и публикует его атомарно. Пока новое поколение полностью не подготовлено, работающее приложение продолжает использовать предыдущее, поэтому неудачное применение никогда не показывает частично применённую модель.
Деструктивная очистка — такая как удаление столбцов или таблиц, которые больше не являются частью модели — откладывается до тех пор, пока предыдущее поколение больше не используется выполняющимися запросами. Это сохраняет согласованность выполняющихся операций во время изменения модели.
Уже открытые экраны не переключаются автоматически; они подхватывают изменения после перезагрузки.
Хранение
Динамическая модель хранит данные времени выполнения в выделенных таблицах базы данных:
-
Динамические атрибуты статических сущностей хранятся в отдельных дополнительных таблицах (side tables). По умолчанию их имена используют префикс
DYN_. Дополнительная таблица создаётся в том же физическом хранилище данных, что и владеющая ею статическая сущность. -
Динамические сущности получают свои собственные выделенные таблицы, также использующие по умолчанию префикс
DYN_, со столбцом первичного ключаDYNMOD_ID.
Каждая сущность может указать физическое хранилище через своё свойство store; если оно опущено, сущность использует хранилище данных main. Ссылки и коллекции разрешены только между сущностями, принадлежащими одному и тому же физическому хранилищу.
Префиксы имён таблиц настраиваются; соответствующие настройки см. в разделах Справочник по YAML и Свойства приложения.