首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >春季引导Hibernate错误“在使用多个数据源时‘DialectResolutionInfo’未设置时访问hibernate.dialect不能为空”

春季引导Hibernate错误“在使用多个数据源时‘DialectResolutionInfo’未设置时访问hibernate.dialect不能为空”
EN

Stack Overflow用户
提问于 2022-05-18 22:01:50
回答 1查看 935关注 0票数 1

我正在构建一个Springboot应用程序,它需要与两个不同的数据库(DB2和Oracle)对话。

春-引导-启动-父版本2.6.6

hibernate版本5.6.7最后

我首先添加了application.properties支持,直到我在下面的DB2文件中添加了与甲骨文相关的设置,这种支持才能正常工作。

添加与oracle相关的设置将导致以下错误:

当“org.hibernate.HibernateException:”未设置时,hibernate.dialect对的访问不能为空

下面是我的application.properties中与数据库和hibernate相关的设置

代码语言:javascript
复制
# ==============================
# = DB2 
db2.datasource.jdbc-url=jdbc:db2://SERVER1:PORT/DATABASE-1:currentSchema=SCHEMA;
db2.datasource.username=USER1
db2.datasource.password=PASSWORD1
db2.datasource.driver-class-name=com.ibm.db2.jcc.DB2Driver
db2.jpa.properties.hibernate.dialect=org.hibernate.dialect.DB2390Dialect

# ==============================
# = ORACLE
oracle.datasource.jdbc-url=jdbc:oracle:thin:@SERVER2:PORT/DATABASE-2
oracle.datasource.username=USER2
oracle.datasource.password=PASSWORD2
oracle.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

# ==============================
# = JPA / HIBERNATE
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

我的pom.xml包含oracle和DB2在其他必需的依赖项中的依赖关系:

代码语言:javascript
复制
... 
<dependency>
        <groupId>com.ibm.db2</groupId>
        <artifactId>jcc</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <scope>runtime</scope>
    </dependency>
...

我已经将我的实体、存储库和数据源配置放置在不同的包中,这是我在本文https://www.javadevjournal.com/spring-boot/multiple-data-sources-with-spring-boot/中所必需的。我的包结构看起来如下:

代码语言:javascript
复制
project
  - dataconfig
      - db2
        - config
        - entity
        - repository
      - oracle
        - config
        - entity
        - repository

我还添加了一些实体、存储库和配置类。

这是我的DB2Configuration课程:

代码语言:javascript
复制
package project.dataconfig.db2.config;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "db2EntityManagerFactory",
        transactionManagerRef = "db2TransactionManager",
        basePackages = {
                "project.dataconfig.db2.repository"
        }
)
public class Db2Configuration {

    @Primary
    @Bean(name = "db2DataSource")
    @ConfigurationProperties(prefix = "db2.datasource")
    public DataSource db2DataSource() {

        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "db2EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder
            , @Qualifier("db2DataSource") DataSource dataSource) {

        return builder
                .dataSource(dataSource)
                .packages("project.dataconfig.db2.entity")
                .persistenceUnit("db2persistanceunit")
                .build();
    }

    @Primary
    @Bean(name = "db2TransactionManager")
    public PlatformTransactionManager db2TransactionManager(
      @Qualifier("db2EntityManagerFactory") EntityManagerFactory db2EntityManagerFactory) {

        return new JpaTransactionManager(db2EntityManagerFactory);
    }
}

这是我的OracleConfiguration课程:

代码语言:javascript
复制
package project.dataconfig.oracle.config;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "oracleEntityManagerFactory",
        transactionManagerRef = "oracleTransactionManager",
        basePackages = {
                "project.dataconfig.oracle.repository"
        }
)
public class OracleConfiguration {

        @Bean(name = "oracleDataSource")
        @ConfigurationProperties(prefix = "oracle.datasource")
        public DataSource oracleDataSource() {

                return DataSourceBuilder.create().build();
        }

        @Bean(name = "oracleEntityManagerFactory")
        public LocalContainerEntityManagerFactoryBean entityManagerFactory(
                EntityManagerFactoryBuilder builder
                , @Qualifier("oracleDataSource") DataSource dataSource) {

                return builder
                        .dataSource(dataSource)
                        .packages("project.dataconfig.oracle.entity")
                        .persistenceUnit("oraclepersistanceunit")
                        .build();
        }

        @Bean(name = "oracleTransactionManager")
        public PlatformTransactionManager oracleTransactionManager(
                @Qualifier("oracleEntityManagerFactory") EntityManagerFactory oracleEntityManagerFactory) {

                return new JpaTransactionManager(oracleEntityManagerFactory);
        }
}

application.properties文件中添加与甲骨文相关的设置之前,我的应用程序只使用上面描述的DB2设置。

一旦我添加了与oracle相关的设置和配置,我就开始得到以下错误:

当“org.hibernate.HibernateException:”未设置时,hibernate.dialect对的访问不能为空

基于错误,我认为问题是由于我在application.properties文件中设置Hibernate方言造成的。我认为这是由以下两种情况之一引起的

代码语言:javascript
复制
...
db2.jpa.properties.hibernate.dialect=org.hibernate.dialect.DB2390Dialect

...
oracle.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

我如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-19 19:15:14

我想明白了。

Db2ConfigurationOracleConfiguration修改方法OracleConfiguration,向它们提供关于hibernate方言的信息:

for DB2

代码语言:javascript
复制
@Primary
@Bean(name = "db2EntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
        EntityManagerFactoryBuilder builder
        , @Qualifier("db2DataSource") DataSource dataSource) {

    final HashMap<String, Object> hibernateProperties = new HashMap<String, Object>();
    hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.DB2390Dialect");

    return builder
            .dataSource(dataSource)
            .packages("project.dataconfig.db2.entity")
            .properties(hibernateProperties)
            .persistenceUnit("db2persistanceunit")
            .build();
}

甲骨文

代码语言:javascript
复制
@Bean(name = "oracleEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
        EntityManagerFactoryBuilder builder
        , @Qualifier("oracleDataSource") DataSource dataSource) {

    final HashMap<String, Object> hibernateProperties = new HashMap<String, Object>();
    hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");

    return builder
            .dataSource(dataSource)
            .packages("project.dataconfig.oracle.entity")
            .properties(hibernateProperties)
            .persistenceUnit("oraclepersistanceunit")
            .build();
}

在此之后,我的控制台在运行app时显示,表明一切都是好的:

代码语言:javascript
复制
HHH000400: Using dialect: org.hibernate.dialect.DB2390Dialect
 Initialized JPA EntityManagerFactory for persistence unit 'db2persistanceunit'
HHH000204: Processing PersistenceUnitInfo [name: oraclepersistanceunit]
HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect
Initialized JPA EntityManagerFactory for persistence unit 'oraclepersistanceunit'

我的执行器/health端点还将数据库视为启动和运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72296481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档