1

I'm running this on my local laptop and it seems work fine, but every time I tried to run on different server this following error appears. (Both using Java 8u291)

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaEntityManagerFactory' defined in class path resource [com/reclassification/HibernateConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1762) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) at com.reclassification.ReclassificationApplication.main(ReclassificationApplication.java:12) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:179) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:119) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:904) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935) at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1821) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1758) ... 24 common frames omitted Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:100) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:54) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:137) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:94) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)

Simon Martinelli
  • 34,053
  • 5
  • 48
  • 82
Zat
  • 19
  • 4

2 Answers2

0

Are you missing application.properties on different server? From trace:

Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set at 

Also check:answer about no dialect Might be that the other server can't connect to DB.

0

The error "Access to DialectResolutionInfo cannot be null" seems very generic. In my case the cause was trying to connect to multiple databases in the same Spring Boot API.

In my case to resolve it, for Spring Boot 2.5.4, this example from Baeldung was helpful, and this from Medium as well.

Here is the application.yml file with dialect specified for MySQL db:

spring:
  datasource:
    primaryDB:
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:<port>/<primary db name>?charSet=LATIN1
      username: <username>
      password: <password>
      initialization-mode: always
    otherDB:
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:<port>/<other db name>?charSet=LATIN1
      username: <username>
      password: <password>
      initialization-mode: always
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
  properties:
    hibernate:
      dialect: org.hibernate.dialect.MySQL5InnoDBDialect

With @Configuration class for the primary db:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactory",
        basePackages = { "com.foo.bar.repository" }
)
public class PrimaryDBConfig {

    @Value("${spring.datasource.primaryDB.driverClassName}")
    private String driver;

    @Value("${spring.datasource.primaryDB.url}")
    private String url;

    @Value("${spring.datasource.primaryDB.username}")
    private String username;

    @Value("${spring.datasource.primaryDB.password}")
    private String password;

    @Primary // this seemingly redundant datasource is apparently used behind
        // ... the scenes and throws an 'unsatisfied dependency' if removed.
    @Bean(name = "dataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primaryDB")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public DataSource dataSourcePrimary(){
        HikariConfig config = new HikariConfig();
        config.setDriverClassName(driver);
        config.setJdbcUrl(url);
        config.setUsername(username);
        config.setPassword(password);
        config.setAutoCommit(true);
        return new HikariDataSource(config);
    }

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean
    entityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("dataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSourcePrimary())
                .packages("com.foo.bar.model")
                .persistenceUnit("primaryDB")
                .build();
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("entityManagerFactory") EntityManagerFactory
                    entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

And "otherDB":

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "otherDBEntityManagerFactory",
        transactionManagerRef = "otherDBTransactionManager",
        basePackages = { "com.foo.bar.otherDB" }
)
public class OtherDBConfig {

    @Value("${spring.datasource.otherDB.driverClassName}")
    private String driver;

    @Value("${spring.datasource.otherDB.url}")
    private String url;

    @Value("${spring.datasource.otherDB.username}")
    private String username;

    @Value("${spring.datasource.otherDB.password}")
    private String password;

    @Bean(name = "otherDBDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.otherDB")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public DataSource dataSourceOtherDB(){
        HikariConfig config = new HikariConfig();
        config.setDriverClassName(driver);
        config.setJdbcUrl(url);
        config.setUsername(username);
        config.setPassword(password);
        config.setAutoCommit(true);
        return new HikariDataSource(config);
    }

    @Bean(name = "otherDBEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean otherDBEntityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("otherDBDataSource") DataSource dataSource) {
        return
                builder
                        .dataSource(dataSourceOtherDB())
                        .packages("com.foo.bar.otherDB.model")
                        .persistenceUnit("otherDB")
                        .build();
    }

    @Bean(name = "otherDBTransactionManager")
    public PlatformTransactionManager otherDBTransactionManager(
            @Qualifier("otherDBEntityManagerFactory") EntityManagerFactory
                    otherDBEntityManagerFactory) {
        return new JpaTransactionManager(otherDBEntityManagerFactory);
    }
}

The package structure looks like this:

enter image description here

Of course, having multiple data sources is an anti-pattern for modern microservices APIs; so this solution is fundamentally for monoliths (and distributed monoliths) :-)

nkmuturi
  • 248
  • 3
  • 10
  • the only reason this works is because you use 2 database from same vendor MySQL. How would you do this if you were using 2 different vendors databases, for example DB2 and Oracle or so? – pixel May 18 '22 at 22:06