Концепции

В этом разделе объясняются основные концепции, лежащие в основе Динамической модели: виды задействованных сущностей, как определяется и версионируется модель, как изменения применяются во время выполнения, где хранятся данные и какие базы данных поддерживаются.

Статические и динамические сущности

Динамическая модель различает два вида сущностей:

  • Статические сущности — это обычные сущности вашего приложения. Они скомпилированы в Java-классы и доступны в classpath.

  • Динамические сущности определяются во время выполнения в модели и генерируются фреймворком. Они не существуют в исходном коде приложения.

Динамические атрибуты могут быть добавлены как к статическим, так и к динамическим сущностям. Это означает, что вы можете обогащать существующие сущности приложения новыми атрибутами и, независимо от этого, вводить совершенно новые сущности, существующие только в модели времени выполнения.

Определение модели

Динамическая модель — это декларативное описание перечислений, сущностей, атрибутов и экранов. Вы редактируете её графически в административном UI: создаёте сущности, добавляете атрибуты с их типами и ограничениями, определяете перечисления, объявляете экраны и пункты меню.

За кулисами модель сериализуется в YAML. Обычно вы работаете с графическим редактором и не редактируете YAML напрямую, но YAML полезен для просмотра, экспорта и импорта. Полный список элементов, поддерживаемых значений и значений по умолчанию см. в разделе Справочник по YAML.

Версионирование и развёртывание

Определение модели хранится в базе данных в виде набора версионируемых конфигураций. В каждый момент времени активна только одна версия. Хранение предыдущих версий позволяет просматривать изменения с течением времени и откатываться путём активации более ранней версии.

При запуске приложения фреймворк может автоматически применять активную версию, так что работающее приложение отражает последнюю развёрнутую модель. Это поведение управляется свойством jmix.dynmodel.deploy-on-app-start.

Применение изменений

При применении модели фреймворк строит новое поколение метаданных из определения модели и публикует его атомарно. Пока новое поколение полностью не подготовлено, работающее приложение продолжает использовать предыдущее, поэтому неудачное применение никогда не показывает частично применённую модель.

Деструктивная очистка — такая как удаление столбцов или таблиц, которые больше не являются частью модели — откладывается до тех пор, пока предыдущее поколение больше не используется выполняющимися запросами. Это сохраняет согласованность выполняющихся операций во время изменения модели.

Уже открытые экраны не переключаются автоматически; они подхватывают изменения после перезагрузки.

Хранение

Динамическая модель хранит данные времени выполнения в выделенных таблицах базы данных:

  • Динамические атрибуты статических сущностей хранятся в отдельных дополнительных таблицах (side tables). По умолчанию их имена используют префикс DYN_. Дополнительная таблица создаётся в том же физическом хранилище данных, что и владеющая ею статическая сущность.

  • Динамические сущности получают свои собственные выделенные таблицы, также использующие по умолчанию префикс DYN_, со столбцом первичного ключа DYNMOD_ID.

Каждая сущность может указать физическое хранилище через своё свойство store; если оно опущено, сущность использует хранилище данных main. Ссылки и коллекции разрешены только между сущностями, принадлежащими одному и тому же физическому хранилищу.

Префиксы имён таблиц настраиваются; соответствующие настройки см. в разделах Справочник по YAML и Свойства приложения.

Поддерживаемые базы данных

Динамическая модель поддерживает следующие базы данных:

  • HSQLDB

  • H2

  • PostgreSQL

  • MySQL 8+

  • MariaDB 10+

  • MS SQL Server 2012+

  • Oracle 12.2+