EN · DE · RU · FR · ES

#1879: DatabaseDialect.kt

projectforge-common/src/main/java/org/projectforge/common/DatabaseDialect.kt перечисление Kotlin — пакет org.projectforge.common, projectforge-common/src/main/java/org/projectforge/common/DatabaseDialect.kt 55 строк · 24 кода · 27 комментариев · 4 пустых
Перечисление Kotlin, определяющее поддерживаемые диалекты баз данных для Hibernate ORM и инструмента миграции Flyway. Сопоставляет типы баз данных с именами классов диалектов Hibernate и именами каталогов поставщиков Flyway. В настоящее время поддерживает PostgreSQL (org.hibernate.dialect.PostgreSQLDialect) и HSQLDB (org.hibernate.dialect.HSQLDialect). Служит единым источником истины для конфигурации типа базы данных при загрузке приложения, разрешении скриптов миграции Flyway и настройке фабрики сессий Hibernate.

Архитектура

Использование возможностей Kotlin

Константы перечисления

КонстантаКласс диалекта HibernateПоставщик FlywayКонтекст использования
PostgreSQLorg.hibernate.dialect.PostgreSQLDialectpostgresqlПродуктивные развертывания — рекомендуемая производственная база данных
HSQLorg.hibernate.dialect.HSQLDialecthsqldbРазработка/тестирование, встроенная установка — используется мастером установки для однопользовательских/локальных инсталляций

Методы объекта-компаньона

fromString(asString: String): DatabaseDialect?

Ищет диалект по имени класса Hibernate. Возвращает null, если совпадение не найдено — вызывающие стороны должны обрабатывать случай null (обычно по умолчанию используется HSQL для разработки). Метод использует простую цепочку if-else, а не поисковую карту, что уместно для небольшого количества поддерживаемых диалектов.

getFlywayVendorName(databaseProductName: String): String

Сопоставляет имя продукта JDBC-драйвера с именем каталога поставщика Flyway. Это критически важно для обнаружения скриптов миграции базы данных Flyway. Flyway организует скрипты миграции в каталогах, специфичных для поставщика:

flyway/{module}/migrate/postgresql/V1.1.0__RELEASE-RemoveMGC.sql
flyway/{module}/migrate/hsqldb/V1.1.0__RELEASE-RemoveMGC.sql
Метод проверяет, содержит ли имя продукта "hsql" (без учета регистра), и возвращает "hsqldb" или "postgresql" соответственно. Это позволяет одной и той же логике миграции работать с разными типами баз данных — специфичные для поставщика различия в SQL (например, синтаксис типов столбцов, работа с последовательностями) изолированы в скриптах миграции, специфичных для поставщика.

Исторический контекст: закомментированные базы данных

Файл содержит комментарий со списком ранее рассматриваемых или запланированных баз данных:

// Пока не поддерживается:
// MYSQL, ORACLE, MS_SQL_SERVER, DB2, INFORMIX, DERBY, UNKOWN;

Это раскрывает замысел поддерживать несколько баз данных — обычное требование для корпоративного программного обеспечения. Текущая реализация поддерживает только PostgreSQL (для продакшена) и HSQLDB (для встраиваемой/разработки), при этом архитектура готова к расширению.

Архитектура базы данных в ProjectForge

Перечисление DatabaseDialect является частью многоуровневой абстракции базы данных:

  1. Hibernate ORM: Объектно-реляционное отображение — свойство asString предоставляет класс диалекта Hibernate для hibernate.cfg.xml или автоконфигурации Spring Boot
  2. Flyway: Управление миграциями базы данных — метод getFlywayVendorName() направляет к скриптам миграции SQL, специфичным для поставщика
  3. Мастер установки: Мастер установки ProjectForge (как Swing, так и GUI Lanterna) использует это перечисление для представления выбора базы данных администраторам и настройки JDBC-подключений

Дизайнерское решение: почему Kotlin?

Этот файл — один из ранних файлов Kotlin в модуле projectforge-common (наряду с другими служебными классами). Использование Kotlin для этого перечисления обеспечивает:

Метод getFlywayVendorName() использует простое совпадение подстроки (contains("hsql")), а не точное сравнение. Это может привести к ложным срабатываниям, если имя продукта базы данных случайно содержит "hsql" как подстроку. Более надежным подходом было бы сопоставление с точным списком известных имен продуктов.
Шаблон пути миграции Flyway использует отдельные каталоги для init/common (создание схемы) и migrate/{vendor} (версионно-специфичные миграции). Такое разделение позволяет базовой схеме быть независимой от базы данных, в то время как миграции, специфичные для поставщика, обрабатывают различия в синтаксисе SQL или функциях (такие как обработка последовательностей в PostgreSQL и HSQLDB или миграция "RemoveMGC", видимая в каталогах flyway проекта).

История Git

868d6abb7 2025 -> 2026
63081666f Заголовки исходных файлов: 2024-> 2025.
b6092df09 Авторское право 2023 -> 2024
ab45d51fa Авторское право 2001-2022 -> 2001-2023.
5f7ef41b8 Авторское право 2021 -> 2022
637063dd7 Ничего (исправлен заголовок исходного файла)
440d191a2 Страница настройки: активация стандартных плагинов. AbstractPlugin: Исправление имени поставщика для flyway.