Концепции
В этом разделе объясняются основные концепции, лежащие в основе Динамической модели: виды задействованных сущностей, как определяется и версионируется модель, как изменения применяются во время выполнения, где хранятся данные и какие базы данных поддерживаются.
Статические и динамические сущности
Динамическая модель различает два вида сущностей:
-
Статические сущности — это обычные сущности вашего приложения. Они скомпилированы в Java-классы и доступны в classpath.
-
Динамические сущности определяются во время выполнения в модели и генерируются фреймворком. Они не существуют в исходном коде приложения.
Динамические атрибуты могут быть добавлены как к статическим, так и к динамическим сущностям. Это означает, что вы можете обогащать существующие сущности приложения новыми атрибутами и, независимо от этого, вводить совершенно новые сущности, существующие только в модели времени выполнения.
Определение модели
Динамическая модель — это декларативное описание перечислений, сущностей, атрибутов и экранов. Вы редактируете её графически в административном UI: создаёте сущности, добавляете атрибуты с их типами и ограничениями, определяете перечисления, объявляете экраны и пункты меню.
За кулисами модель сериализуется в YAML. Обычно вы работаете с графическим редактором и не редактируете YAML напрямую, но YAML полезен для просмотра, экспорта и импорта. Полный список элементов, поддерживаемых значений и значений по умолчанию см. в разделе Справочник по YAML.
Версионирование и развёртывание
Определение модели хранится в базе данных в виде набора версионируемых конфигураций. Каждое применение сохраняет новую версию, и в каждый момент времени активна только одна версия. Предыдущие версии сохраняются, их можно просмотреть в истории модели. Чтобы вернуться к более ранней модели, скопируйте её YAML из истории и примените его снова.
При запуске приложения фреймворк может автоматически применять активную версию, так что работающее приложение отражает последнюю развёрнутую модель. Это поведение управляется свойством jmix.dynmodel.deploy-on-app-start.
Применение изменений
При применении модели фреймворк строит новое поколение метаданных из определения модели и публикует его атомарно. Пока новое поколение полностью не подготовлено, работающее приложение продолжает использовать предыдущее, поэтому неудачное применение никогда не показывает частично применённую модель.
Деструктивная очистка — такая как удаление столбцов или таблиц, которые больше не являются частью модели — откладывается до тех пор, пока предыдущее поколение больше не используется выполняющимися запросами. Это сохраняет согласованность выполняющихся операций во время изменения модели.
Уже открытые экраны не переключаются автоматически; они подхватывают изменения после перезагрузки.
Фреймворк также проверяет, что никто не применил другую модель после того, как вы открыли модель для редактирования. Если это произошло, ваше применение отклоняется, чтобы оно незаметно не отменило чужие изменения. В этом случае перезагрузите настройки модели и повторите свои изменения.
Кластер
Начиная с Jmix 3.1
Динамическая модель может работать в кластере серверов приложения. Когда поддержка кластера включена:
-
Модель, применённая на одном узле, применяется на всех остальных узлах без перезапуска.
-
Во всём кластере одновременно может выполняться только одно применение. Если пользователь пытается применить модель, пока она применяется на другом узле, применение отклоняется с сообщением, в котором указан пользователь, выполняющий применение. Повторите попытку после завершения другого применения.
Чтобы включить поддержку кластера:
-
Установите свойство jmix.dynmodel.cluster.enabled в значение
true. -
Добавьте в проект дополнение Пессимистическая блокировка. Оно хранит блокировку применения для кластера. Если поддержка кластера включена, а дополнение отсутствует, приложение не запускается.
-
Настройте взаимодействие между узлами кластера, как описано в разделе Кластерное взаимодействие. Оно нужно как для сообщений о применённых моделях, так и для блокировки применения. Без него модель, применённая на одном узле, попадает на другие узлы только после их перезапуска.
Свойство jmix.dynmodel.cluster.apply-lock-timeout-sec задаёт, когда снимается блокировка, оставленная узлом, который остановился во время применения. Установите значение больше самого долгого применения в вашем приложении.
Хранение
Динамическая модель хранит данные времени выполнения в выделенных таблицах базы данных:
-
Динамические атрибуты статических сущностей хранятся в отдельных дополнительных таблицах (side tables). По умолчанию их имена используют префикс
DYN_. Дополнительная таблица создаётся в том же физическом хранилище данных, что и владеющая ею статическая сущность. -
Динамические сущности получают свои собственные выделенные таблицы, также использующие по умолчанию префикс
DYN_, со столбцом первичного ключаDYNMOD_ID.
Каждая сущность может указать физическое хранилище через своё свойство store; если оно опущено, сущность использует хранилище данных main. Ссылки и коллекции разрешены только между сущностями, принадлежащими одному и тому же физическому хранилищу.
Префиксы имён таблиц настраиваются; соответствующие настройки см. в разделах Справочник по YAML и Свойства приложения.
Data Tools
Начиная с Jmix 3.1
Динамические сущности и динамические атрибуты отображаются в экранах дополнения Data Tools:
-
Экран Data model показывает динамические сущности с их хранилищем данных и таблицей, а также динамические атрибуты статических сущностей со столбцами дополнительных таблиц. Вычисляемые атрибуты и атрибуты-коллекции показываются без столбца. На диаграмме видно, какие сущности и атрибуты являются динамическими.
-
Инспектор сущностей позволяет просматривать, создавать, редактировать и удалять экземпляры динамических сущностей, а также редактировать динамические атрибуты статических сущностей. В компоненте genericFilter можно фильтровать и сортировать по динамическим атрибутам.