EN · DE · RU · FR · ES

#1879: DatabaseDialect.kt

projectforge-common/src/main/java/org/projectforge/common/DatabaseDialect.kt Kotlin-Enum — Paket org.projectforge.common, projectforge-common/src/main/java/org/projectforge/common/DatabaseDialect.kt 55 Zeilen · 24 Code · 27 Kommentare · 4 leer
Kotlin-Enum, das die unterstützten Datenbankdialekte für Hibernate ORM und Flyway-Migrationstools definiert. Ordnet Datenbanktypen ihren Hibernate-Dialekt-Klassennamen und Flyway-Vendor-Verzeichnisnamen zu. Unterstützt derzeit PostgreSQL (org.hibernate.dialect.PostgreSQLDialect) und HSQLDB (org.hibernate.dialect.HSQLDialect). Dient als einzige Quelle der Wahrheit für die Datenbanktypkonfiguration im gesamten Anwendungs-Bootstrap, der Flyway-Migrationsskriptauflösung und der Hibernate-Session-Factory-Einrichtung.

Architektur

Verwendung von Kotlin-Features

Enum-Konstanten

KonstanteHibernate-Dialekt-KlasseFlyway-VendorVerwendungskontext
PostgreSQLorg.hibernate.dialect.PostgreSQLDialectpostgresqlProduktionsumgebungen – die empfohlene Produktionsdatenbank
HSQLorg.hibernate.dialect.HSQLDialecthsqldbEntwicklung/Test, eingebettetes Setup – wird vom Setup-Assistenten für Einzelbenutzer/lokale Installationen verwendet

Methoden des Begleitobjekts

fromString(asString: String): DatabaseDialect?

Sucht einen Dialekt anhand seines Hibernate-Klassennamens. Gibt null zurück, wenn keine Übereinstimmung gefunden wird – Aufrufer müssen den Null-Fall behandeln (typischerweise durch Standardeinstellung auf HSQL für die Entwicklung). Die Methode verwendet eine einfache If-Else-Kette anstelle einer Nachschlagetabelle, was für die geringe Anzahl unterstützter Dialekte angemessen ist.

getFlywayVendorName(databaseProductName: String): String

Ordnet einen JDBC-Treiber-Produktnamen dem Flyway-Vendor-Verzeichnisnamen zu. Dies ist entscheidend für die Flyway-Datenbankmigrations-Skriptfindung. Flyway organisiert Migrationsskripte in vendorspezifischen Verzeichnissen:

flyway/{modul}/migrate/postgresql/V1.1.0__RELEASE-RemoveMGC.sql
flyway/{modul}/migrate/hsqldb/V1.1.0__RELEASE-RemoveMGC.sql
Die Methode prüft, ob der Produktname "hsql" enthält (Groß-/Kleinschreibung nicht beachtet) und gibt entsprechend "hsqldb" oder "postgresql" zurück. Dies ermöglicht es, dieselbe Migrationslogik über Datenbanktypen hinweg zu verwenden – vendorspezifische SQL-Unterschiede (z. B. Spaltentypsyntax, Sequenzbehandlung) sind in den vendorspezifischen Migrationsskripten isoliert.

Historischer Kontext: Auskommentierte Datenbanken

Die Datei enthält einen Kommentar, der zuvor in Betracht gezogene oder geplante Datenbankunterstützungen auflistet:

// Noch nicht unterstützt:
// MYSQL, ORACLE, MS_SQL_SERVER, DB2, INFORMIX, DERBY, UNBEKANNT;

Dies offenbart die Designabsicht, mehrere Datenbanken zu unterstützen – eine häufige Anforderung an Unternehmenssoftware. Die aktuelle Implementierung unterstützt nur PostgreSQL (für die Produktion) und HSQLDB (für eingebettete/Entwicklungsumgebungen), wobei die Architektur für Erweiterungen bereit ist.

Datenbankarchitektur in ProjectForge

Der DatabaseDialect-Enum ist Teil einer geschichteten Datenbankabstraktion:

  1. Hibernate ORM: Objektrelationales Mapping – die asString-Eigenschaft stellt die Hibernate-Dialektklasse für hibernate.cfg.xml oder die Spring-Boot-Autokonfiguration bereit
  2. Flyway: Datenbankmigrationsverwaltung – die Methode getFlywayVendorName() leitet zu vendorspezifischen SQL-Migrationsskripten weiter
  3. Setup-Assistent: Der ProjectForge-Setup-Assistent (sowohl Swing- als auch Lanterna-GUIs) verwendet diesen Enum, um Administratoren Datenbankauswahlmöglichkeiten zu präsentieren und JDBC-Verbindungen zu konfigurieren

Designentscheidung: Warum Kotlin?

Diese Datei ist eine der früheren Kotlin-Dateien im Modul projectforge-common (neben anderen Utility-Klassen). Die Verwendung von Kotlin für diesen Enum bietet:

Die Methode getFlywayVendorName() verwendet einen einfachen Substring-Abgleich (contains("hsql")) anstelle eines exakten Vergleichs. Dies könnte zu falschen Positiven führen, wenn ein Datenbankproduktname zufällig "hsql" als Teilstring enthält. Ein robusterer Ansatz wäre der Abgleich gegen eine exakte Liste bekannter Produktnamen.
Das Flyway-Migrationspfadmuster verwendet separate Verzeichnisse für init/common (Schemaerstellung) und migrate/{vendor} (versionsspezifische Migrationen). Diese Trennung ermöglicht es, dass das Basisschema datenbankunabhängig ist, während vendorspezifische Migrationen Unterschiede in der SQL-Syntax oder den Funktionen behandeln (wie PostgreSQL vs. HSQLDB für die Sequenzbehandlung oder die "RemoveMGC"-Migration, die in den Flyway-Verzeichnissen des Projekts sichtbar ist).

Git-Verlauf

868d6abb7 2025 -> 2026
63081666f Quelltextdatei-Header: 2024 -> 2025.
b6092df09 Copyright 2023 -> 2024
ab45d51fa Copyright 2001-2022 -> 2001-2023.
5f7ef41b8 Copyright 2021 -> 2022
637063dd7 Nichts (Quelltextdatei-Header korrigiert)
440d191a2 Setup-Seite: Aktivierung von Standard-Plugins. AbstractPlugin: Korrektur des Vendor-Namens für Flyway.