EN · DE · RU · FR · ES

#1879 : DatabaseDialect.kt

projectforge-common/src/main/java/org/projectforge/common/DatabaseDialect.kt Enum Kotlin — package org.projectforge.common, projectforge-common/src/main/java/org/projectforge/common/DatabaseDialect.kt 55 lignes · 24 code · 27 commentaires · 4 vides
Enum Kotlin définissant les dialectes de base de données pris en charge pour Hibernate ORM et l'outil de migration Flyway. Mappe les types de base de données à leurs noms de classe de dialecte Hibernate et aux noms de répertoire de fournisseur Flyway. Prend actuellement en charge PostgreSQL (org.hibernate.dialect.PostgreSQLDialect) et HSQLDB (org.hibernate.dialect.HSQLDialect). Sert de source unique de vérité pour la configuration du type de base de données dans le bootstrap de l'application, la résolution des scripts de migration Flyway et la configuration de la session factory Hibernate.

Architecture

Utilisation des fonctionnalités Kotlin

Constantes de l'enum

ConstanteClasse de dialecte HibernateFournisseur FlywayContexte d'utilisation
PostgreSQLorg.hibernate.dialect.PostgreSQLDialectpostgresqlDéploiements de production — la base de données de production recommandée
HSQLorg.hibernate.dialect.HSQLDialecthsqldbDéveloppement/test, configuration embarquée — utilisée par l'assistant d'installation pour les installations mono-utilisateur/locales

Méthodes de l'objet compagnon

fromString(asString: String): DatabaseDialect?

Recherche un dialecte par son nom de classe Hibernate. Retourne null si aucune correspondance n'est trouvée — les appelants doivent gérer le cas null (généralement en utilisant HSQL par défaut pour le développement). La méthode utilise une simple chaîne if-else plutôt qu'une table de correspondance, ce qui est approprié pour le petit nombre de dialectes pris en charge.

getFlywayVendorName(databaseProductName: String): String

Mappe un nom de produit de pilote JDBC au nom de répertoire du fournisseur Flyway. Ceci est essentiel pour la découverte des scripts de migration de base de données Flyway. Flyway organise les scripts de migration dans des répertoires spécifiques au fournisseur :

flyway/{module}/migrate/postgresql/V1.1.0__RELEASE-RemoveMGC.sql
flyway/{module}/migrate/hsqldb/V1.1.0__RELEASE-RemoveMGC.sql
La méthode vérifie si le nom du produit contient "hsql" (insensible à la casse) et retourne "hsqldb" ou "postgresql" en conséquence. Cela permet à la même logique de migration de fonctionner sur différents types de bases de données — les différences SQL spécifiques au fournisseur (par exemple, la syntaxe des types de colonnes, la gestion des séquences) sont isolées dans les scripts de migration spécifiques au fournisseur.

Contexte historique : bases de données commentées

Le fichier contient un commentaire listant les bases de données précédemment envisagées ou planifiées :

// Pas encore pris en charge :
// MYSQL, ORACLE, MS_SQL_SERVER, DB2, INFORMIX, DERBY, UNKOWN;

Cela révèle l'intention de conception de prendre en charge plusieurs bases de données — une exigence courante pour les logiciels d'entreprise. L'implémentation actuelle ne prend en charge que PostgreSQL (pour la production) et HSQLDB (pour l'embarqué/développement), avec une architecture prête à être étendue.

Architecture des bases de données dans ProjectForge

L'enum DatabaseDialect fait partie d'une abstraction de base de données en couches :

  1. Hibernate ORM : Mapping objet-relationnel — la propriété asString fournit la classe de dialecte Hibernate pour hibernate.cfg.xml ou l'auto-configuration Spring Boot
  2. Flyway : Gestion des migrations de base de données — la méthode getFlywayVendorName() achemine vers les scripts de migration SQL spécifiques au fournisseur
  3. Assistant d'installation : L'assistant d'installation de ProjectForge (interfaces graphiques Swing et Lanterna) utilise cette enum pour présenter les choix de base de données aux administrateurs et configurer les connexions JDBC

Décision de conception : pourquoi Kotlin ?

Ce fichier est l'un des premiers fichiers Kotlin du module projectforge-common (avec d'autres classes utilitaires). L'utilisation de Kotlin pour cette enum offre :

La méthode getFlywayVendorName() utilise une simple correspondance de sous-chaîne (contains("hsql")) plutôt qu'une comparaison exacte. Cela pourrait produire des faux positifs si un nom de produit de base de données contient par hasard "hsql" comme sous-chaîne. Une approche plus robuste consisterait à effectuer une correspondance avec une liste exacte de noms de produits connus.
Le modèle de chemin de migration Flyway utilise des répertoires séparés pour init/common (création du schéma) et migrate/{vendor} (migrations spécifiques à une version). Cette séparation permet au schéma de base d'être indépendant de la base de données tandis que les migrations spécifiques au fournisseur gèrent les différences de syntaxe SQL ou de fonctionnalités (comme PostgreSQL vs HSQLDB pour la gestion des séquences ou la migration "RemoveMGC" visible dans les répertoires flyway du projet).

Historique Git

868d6abb7 2025 -> 2026
63081666f En-têtes des fichiers source : 2024 -> 2025.
b6092df09 Copyright 2023 -> 2024
ab45d51fa Copyright 2001-2022 -> 2001-2023.
5f7ef41b8 Copyright 2021 -> 2022
637063dd7 Rien (en-tête de fichier source corrigé)
440d191a2 Page d'installation : activation des plugins standards. AbstractPlugin : Correction du nom du fournisseur pour flyway.