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.jpa.config.HibernatePropertiesProvider;
import ca.uhn.fhir.util.ReflectionUtil;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver;
import org.hibernate.engine.jdbc.dialect.spi.DatabaseMetaDataDialectResolutionInfoAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
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) {
DataSource connection = myEntityManagerFactory.getDataSource();
try (Connection dbConnection = connection.getConnection()) {
dialect = new StandardDialectResolver()
public JpaHibernatePropertiesProvider(LocalContainerEntityManagerFactoryBean theEntityManagerFactory) {
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()) {
myDialect = new StandardDialectResolver()
.resolveDialect(new DatabaseMetaDataDialectResolutionInfoAdapter(dbConnection.getMetaData()));
} catch (SQLException sqlException) {
throw new ConfigurationException(sqlException.getMessage(), sqlException);
} catch (SQLException sqlException) {
throw new ConfigurationException(sqlException.getMessage(), sqlException);
}
}
}
@Override
public Dialect getDialect() {
return dialect;
return myDialect;
}
}