Improve dialect handling

This commit is contained in:
James Agnew
2025-06-02 17:55:05 +02:00
parent 0b907a4121
commit 9ecffeda11

View File

@@ -2,31 +2,44 @@ package ca.uhn.fhir.jpa.starter.util;
import ca.uhn.fhir.context.ConfigurationException; import ca.uhn.fhir.context.ConfigurationException;
import ca.uhn.fhir.jpa.config.HibernatePropertiesProvider; import ca.uhn.fhir.jpa.config.HibernatePropertiesProvider;
import ca.uhn.fhir.util.ReflectionUtil;
import org.hibernate.dialect.Dialect; import org.hibernate.dialect.Dialect;
import org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver; import org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver;
import org.hibernate.engine.jdbc.dialect.spi.DatabaseMetaDataDialectResolutionInfoAdapter; import org.hibernate.engine.jdbc.dialect.spi.DatabaseMetaDataDialectResolutionInfoAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import javax.sql.DataSource; import javax.sql.DataSource;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
public class JpaHibernatePropertiesProvider extends HibernatePropertiesProvider { public class JpaHibernatePropertiesProvider extends HibernatePropertiesProvider {
private static final Logger ourLog = LoggerFactory.getLogger(JpaHibernatePropertiesProvider.class);
private final Dialect dialect; private final Dialect myDialect;
public JpaHibernatePropertiesProvider(LocalContainerEntityManagerFactoryBean myEntityManagerFactory) { public JpaHibernatePropertiesProvider(LocalContainerEntityManagerFactoryBean theEntityManagerFactory) {
DataSource connection = myEntityManagerFactory.getDataSource(); String dialectClass =
(String) theEntityManagerFactory.getJpaPropertyMap().get("hibernate.dialect");
if (isNotBlank(dialectClass)) {
myDialect = ReflectionUtil.newInstanceOrReturnNull(dialectClass, Dialect.class);
} else {
ourLog.warn("'hibernate.dialect' not set in application configuration! Please explicitly specify a valid HAPI FHIR hibernate dialect.");
DataSource connection = theEntityManagerFactory.getDataSource();
try (Connection dbConnection = connection.getConnection()) { try (Connection dbConnection = connection.getConnection()) {
dialect = new StandardDialectResolver() myDialect = new StandardDialectResolver()
.resolveDialect(new DatabaseMetaDataDialectResolutionInfoAdapter(dbConnection.getMetaData())); .resolveDialect(new DatabaseMetaDataDialectResolutionInfoAdapter(dbConnection.getMetaData()));
} catch (SQLException sqlException) { } catch (SQLException sqlException) {
throw new ConfigurationException(sqlException.getMessage(), sqlException); throw new ConfigurationException(sqlException.getMessage(), sqlException);
} }
} }
}
@Override @Override
public Dialect getDialect() { public Dialect getDialect() {
return dialect; return myDialect;
} }
} }