在Spring Boot 2.1中覆盖Hibernate ConnectionProvider

时间:2019-07-12 00:32:11

标签: java spring hibernate spring-boot kotlin

我正在升级kotlin Spring Boot 1.x应用程序以使用Spring Boot 2.1.6

以前,我使用EntityManagerFactoryBeanCallbackhibernate.connection.provider_class设置为ConnectionProvider的自定义实现。在Spring Boot 2.0和2.1中已弃用并删除了它。

我现在正尝试使用HibernatePropertiesCustomizer

@Bean
fun hibernatePropertiesCustomizer() = HibernatePropertiesCustomizer {
    it["hibernate.connection.provider_class"] = ScopedConnectionProvider::class.java.name
}

应用程序现在引发错误:

java.lang.IllegalStateException: Failed to load ApplicationContext

    Caused by:
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.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]

        Caused by:
        org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

            Caused by:
            org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

如果我在it["hibernate.connection.provider_class"] = ScopedConnectionProvider::class.java.name行中注释掉,那么所有的东西都可以正常工作,除了自定义ConnectionProvider

作为参考,我正在使用ScopedConnectionProvider通过在每个连接上设置代表客户范围ID的变量来启用我们的多租户。任何允许我在每个连接上运行SET @scope_id = ?查询的替代解决方案也都可以。

相关版本信息:

  • Spring Boot:2.1.6
  • 春季:5.1.8
  • 休眠:5.3.10
  • 科特琳:1.3.21

1 个答案:

答案 0 :(得分:0)

事实证明,数据源已不再正确地注入我的package automationFramework; import browser.Browser; public class FirstTestCase extends Browser{ public static void main(String[] args) throws Exception { Browser.launchnavigatetoUrl(driver); System.out.println("The length of title is :" +Browser.getDriver(driver).getWindowHandle().length()); Browser.getDriver(driver).close(); } } 中。我进行了更改,以便从ScopedConnectionProvider继承,而不是从头开始实现自己的DatasourceConnectionProviderImpl。这似乎消除了指定方言的需要。