EN · DE · RU · FR · ES

#1879: DatabaseDialect.kt

projectforge-common/src/main/java/org/projectforge/common/DatabaseDialect.kt Enum de Kotlin — paquete org.projectforge.common, projectforge-common/src/main/java/org/projectforge/common/DatabaseDialect.kt 55 líneas · 24 código · 27 comentarios · 4 en blanco
Enum de Kotlin que define los dialectos de base de datos compatibles para Hibernate ORM y la herramienta de migración Flyway. Asigna los tipos de base de datos a sus nombres de clase de dialecto de Hibernate y nombres de directorio de proveedor de Flyway. Actualmente compatible con PostgreSQL (org.hibernate.dialect.PostgreSQLDialect) y HSQLDB (org.hibernate.dialect.HSQLDialect). Actúa como la única fuente de verdad para la configuración del tipo de base de datos en el arranque de la aplicación, la resolución de scripts de migración de Flyway y la configuración de la fábrica de sesiones de Hibernate.

Arquitectura

Uso de características de Kotlin

Constantes del Enum

ConstanteClase de Dialecto HibernateProveedor FlywayContexto de Uso
PostgreSQLorg.hibernate.dialect.PostgreSQLDialectpostgresqlDespliegues en producción — la base de datos recomendada para producción
HSQLorg.hibernate.dialect.HSQLDialecthsqldbDesarrollo/pruebas, configuración embebida — utilizado por el asistente de configuración para instalaciones de un solo usuario/locales

Métodos del Objeto Complementario

fromString(asString: String): DatabaseDialect?

Busca un dialecto por su nombre de clase de Hibernate. Devuelve null si no se encuentra ninguna coincidencia — los llamadores deben manejar el caso nulo (generalmente predeterminando a HSQL para desarrollo). El método utiliza una cadena simple if-else en lugar de un mapa de búsqueda, apropiado para el pequeño número de dialectos compatibles.

getFlywayVendorName(databaseProductName: String): String

Asigna un nombre de producto del controlador JDBC al nombre del directorio del proveedor de Flyway. Esto es crítico para el descubrimiento de scripts de migración de base de datos de Flyway. Flyway organiza los scripts de migración en directorios específicos del proveedor:

flyway/{module}/migrate/postgresql/V1.1.0__RELEASE-RemoveMGC.sql
flyway/{module}/migrate/hsqldb/V1.1.0__RELEASE-RemoveMGC.sql
El método verifica si el nombre del producto contiene "hsql" (sin distinción de mayúsculas/minúsculas) y devuelve "hsqldb" o "postgresql" según corresponda. Esto permite que la misma lógica de migración funcione en todos los tipos de base de datos — las diferencias SQL específicas del proveedor (por ejemplo, sintaxis de tipos de columna, manejo de secuencias) se aíslan en los scripts de migración específicos del proveedor.

Contexto Histórico: Bases de Datos Comentadas

El archivo contiene un comentario que enumera el soporte de base de datos considerado o planificado anteriormente:

// Aún no compatible:
// MYSQL, ORACLE, MS_SQL_SERVER, DB2, INFORMIX, DERBY, UNKOWN;

Esto revela la intención de diseño de admitir múltiples bases de datos — un requisito común para el software empresarial. La implementación actual solo admite PostgreSQL (para producción) y HSQLDB (para embebido/desarrollo), con la arquitectura lista para extensión.

Arquitectura de Base de Datos en ProjectForge

El enum DatabaseDialect es parte de una abstracción de base de datos en capas:

  1. Hibernate ORM: Mapeo objeto-relacional — la propiedad asString proporciona la clase de dialecto de Hibernate para hibernate.cfg.xml o la configuración automática de Spring Boot
  2. Flyway: Gestión de migraciones de base de datos — el método getFlywayVendorName() dirige a los scripts de migración SQL específicos del proveedor
  3. Asistente de Configuración: El asistente de configuración de ProjectForge (interfaces gráficas Swing y Lanterna) utiliza este enum para presentar opciones de base de datos a los administradores y configurar conexiones JDBC

Decisión de Diseño: ¿Por qué Kotlin?

Este archivo es uno de los primeros archivos Kotlin en el módulo projectforge-common (junto con otras clases de utilidad). Usar Kotlin para este enum proporciona:

El método getFlywayVendorName() utiliza una simple coincidencia de subcadena (contains("hsql")) en lugar de una comparación exacta. Esto podría producir falsos positivos si un nombre de producto de base de datos contiene casualmente "hsql" como subcadena. Un enfoque más robusto sería comparar con una lista exacta de nombres de producto conocidos.
El patrón de ruta de migración de Flyway utiliza directorios separados para init/common (creación de esquema) y migrate/{vendor} (migraciones específicas de versión). Esta separación permite que el esquema base sea independiente de la base de datos, mientras que las migraciones específicas del proveedor manejan diferencias en la sintaxis SQL o características (como PostgreSQL vs HSQLDB para el manejo de secuencias o la migración "RemoveMGC" visible en los directorios flyway del proyecto).

Historial Git

868d6abb7 2025 -> 2026
63081666f Encabezados de archivos fuente: 2024-> 2025.
b6092df09 Copyright 2023 -> 2024
ab45d51fa Copyright 2001-2022 -> 2001-2023.
5f7ef41b8 Copyright 2021 -> 2022
637063dd7 Nada (encabezado de archivo fuente corregido)
440d191a2 Página de configuración: activación de plugins estándar. AbstractPlugin: Corrección del nombre del proveedor para flyway.