繁体   English   中英

Spring 引导 JPA - 当“hibernate.dialect”在 JAVA 8u291 中不起作用时,对 DialectResolutionInfo 的访问不能为 null

[英]Spring Boot JPA - Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not working in JAVA 8u291

我在我的本地笔记本电脑上运行它,它似乎工作正常,但每次我尝试在不同的服务器上运行时,都会出现以下错误。 (均使用 Java 8u291)

org.springframework.beans.factory.BeanCreationException:在 class 路径资源 [com/reclassification/HibernateConfiguration.class] 中定义名称为“jpaEntityManagerFactory”的 bean 创建时出错:调用 init 方法失败; 嵌套的异常是 org.hibernate.service.spi.ServiceException:无法创建请求的服务 [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeCapableBean. 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) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 在 org.springframework.beans.springbeans.framework.framework support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) 在 org.sp ringframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105) 在 org.springframework.context.support.AbstractBeanApplicationBean AbstractApplicationContext.java:867) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext14238:88:142888:5888:549) .springframework.boot.SpringApplication.refresh(SpringApplication.java:775) 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:316) org.springframework.boot.SpringApplication.run(SpringApplication.88213 246945888:1260) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) 在 com.reclassification.ReclassificationApplication.main(ReclassificationApplication.java:12) 在 sun.reflect.NativeMethodAccessorImpl) 在 sun.reflect.NativeMethodAccessorImpl .reflect.NativeMethodAccessorImpl.invoke(未知来源)位于 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)位于 java.lang.reflect.Method.invoke(未知来源)位于 org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner .java:48) 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:87) 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:50) 在 org.springframework.boot。 loader.JarLauncher.main(JarLauncher.java:51) Caused by: org.hibernate.service.spi.ServiceException: 无法创建请求的服务 [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] 在 org86789839服务.i nternal.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.88213246 945888: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 ) 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390) 在 org.springframework.882 46207785488.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)在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1758)... 省略了 24 个常见框架 由:org.hibernate.HibernateException: Access to DialectResolutionInfonate cannot be 886314881253设置在 org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:100) 在 org.hibernate.engine.883111122796888.hibernate.engine.883111122796888.dialectIdialectIdialectIdialect.internalect.dialect.dialect ct(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)

您是否缺少不同服务器上的 application.properties? 从跟踪:

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

还要检查: 关于没有方言的回答可能是另一台服务器无法连接到数据库。

错误“Access to DialectResolutionInfo cannot be null”看起来很一般。 在我的例子中,原因是试图连接到同一个 Spring Boot API 中的多个数据库。

在我解决它的情况下,对于 Spring Boot 2.5.4,这个来自 Baeldung 的例子很有帮助, 这个也来自 Medium

这是为 MySQL db 指定方言的application.yml文件:

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

主数据库使用@Configuration class:

@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);
    }
}

和“其他数据库”:

@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);
    }
}

package 结构如下所示:

在此处输入图像描述

当然,拥有多个数据源是现代微服务 API 的反模式; 所以这个解决方案基本上是针对单体(和分布式单体)的:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM