From 4c4cf83fe4513e6f2df62db0fa7325b3eb02f6f5 Mon Sep 17 00:00:00 2001 From: Thibault Meyer Date: Thu, 23 Nov 2023 20:38:34 +0100 Subject: [PATCH] Fix can't override Hibernate dialect Signed-off-by: Thibault Meyer --- .../module/EntityManagerProvider.java | 30 +++++++++++++++++-- .../hibernate/module/HibernateModule.java | 9 +++++- .../src/main/resources/reference.conf | 13 ++++++++ 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/voidframework-persistence-hibernate/src/main/java/dev/voidframework/persistence/hibernate/module/EntityManagerProvider.java b/voidframework-persistence-hibernate/src/main/java/dev/voidframework/persistence/hibernate/module/EntityManagerProvider.java index 0ed72643..4b1e9aad 100644 --- a/voidframework-persistence-hibernate/src/main/java/dev/voidframework/persistence/hibernate/module/EntityManagerProvider.java +++ b/voidframework-persistence-hibernate/src/main/java/dev/voidframework/persistence/hibernate/module/EntityManagerProvider.java @@ -12,6 +12,7 @@ import jakarta.persistence.spi.ClassTransformer; import jakarta.persistence.spi.PersistenceUnitInfo; import jakarta.persistence.spi.PersistenceUnitTransactionType; +import org.apache.commons.lang3.StringUtils; import org.hibernate.cfg.JdbcSettings; import org.hibernate.cfg.SchemaToolingSettings; import org.hibernate.jpa.HibernatePersistenceProvider; @@ -26,6 +27,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Deque; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -45,6 +47,7 @@ public class EntityManagerProvider implements Provider { private static final Logger LOGGER = LoggerFactory.getLogger(EntityManagerProvider.class); private final String dataSourceName; + private final String dialect; private final String modelsJarUrlPattern; private final ThreadLocal> currentEntityManager; private Provider dataSourceManagerProvider; @@ -59,7 +62,23 @@ public class EntityManagerProvider implements Provider { */ public EntityManagerProvider(final String dataSourceName, final String modelsJarUrlPattern) { + this(dataSourceName, null, modelsJarUrlPattern); + } + + /** + * Build a new instance. + * + * @param dataSourceName The data source name + * @param dialect The dialect + * @param modelsJarUrlPattern The pattern to identify JAR containing models + * @since 1.11.1 + */ + public EntityManagerProvider(final String dataSourceName, + final String dialect, + final String modelsJarUrlPattern) { + this.dataSourceName = dataSourceName; + this.dialect = dialect; this.modelsJarUrlPattern = modelsJarUrlPattern; this.currentEntityManager = new ThreadLocal<>(); } @@ -150,11 +169,16 @@ private void createEntityManagerFactoryIfNeeded() { final List javaFileUrlList = createModelsJarFileUrls(); // Creates entity manager + final Map properties = new HashMap<>(); + properties.put(JdbcSettings.JAKARTA_JTA_DATASOURCE, this.dataSourceManagerProvider.get().getDataSource(dataSourceName)); + properties.put(SchemaToolingSettings.HBM2DDL_AUTO, "none"); + if (StringUtils.isNotBlank(dialect)) { + properties.put(JdbcSettings.DIALECT, dialect); + } + this.entityManagerFactory = new HibernatePersistenceProvider().createContainerEntityManagerFactory( new PersistenceUnitInfoIml(dataSourceName, javaFileUrlList), - Map.of( - JdbcSettings.JAKARTA_JTA_DATASOURCE, this.dataSourceManagerProvider.get().getDataSource(dataSourceName), - SchemaToolingSettings.HBM2DDL_AUTO, "none")); + properties); } } diff --git a/voidframework-persistence-hibernate/src/main/java/dev/voidframework/persistence/hibernate/module/HibernateModule.java b/voidframework-persistence-hibernate/src/main/java/dev/voidframework/persistence/hibernate/module/HibernateModule.java index cb674af4..d74dfe42 100644 --- a/voidframework-persistence-hibernate/src/main/java/dev/voidframework/persistence/hibernate/module/HibernateModule.java +++ b/voidframework-persistence-hibernate/src/main/java/dev/voidframework/persistence/hibernate/module/HibernateModule.java @@ -46,7 +46,14 @@ protected void configure() { } for (final String dataSourceName : dataSourceNameSet) { - final EntityManagerProvider entityManagerProvider = new EntityManagerProvider(dataSourceName, modelsJarUrlPattern); + // Create entity manager + final String dialect = ConfigurationUtils.getStringOrDefault( + this.configuration, + "voidframework.datasource." + dataSourceName + ".dialect", + null); + final EntityManagerProvider entityManagerProvider = new EntityManagerProvider(dataSourceName, dialect, modelsJarUrlPattern); + + // Guice requestInjection(entityManagerProvider); bind(EntityManager.class).annotatedWith(Names.named(dataSourceName)).toProvider(entityManagerProvider); diff --git a/voidframework-persistence-hibernate/src/main/resources/reference.conf b/voidframework-persistence-hibernate/src/main/resources/reference.conf index 01158a52..174cddc3 100644 --- a/voidframework-persistence-hibernate/src/main/resources/reference.conf +++ b/voidframework-persistence-hibernate/src/main/resources/reference.conf @@ -18,4 +18,17 @@ voidframework { # WE RECOMMEND THAT YOU ADAPT THIS CONFIGURATION TO YOUR APPLICATION TO IMPROVE THE INITIALIZATION TIME modelsJarUrlPattern = "auto" } + + # Data source configuration + # datasource { + + # Default data source + # default { + + # Defines the Hibernate SQL dialect. + # By default (value is null or empty), Hibernate will attempt to automatically determine the + # dialect from the JDBC URL and JDBC metadata, so this setting is not usually necessary + # dialect = null + # } + # } }