我正在構建一個 Springboot 應用程式,它需要與 2 個不同的資料庫(DB2 和 Oracle)通信。
Spring-boot-starter-parent 版本 2.6.6
休眠版本 5.6.7.Final
我首先添加了 DB2 支持,并且一直運行良好,直到我在下面的application.properties檔案中添加了 oracle 相關設定。
添加 oracle 相關設定會導致以下錯誤:
org.hibernate.HibernateException:當未設定“hibernate.dialect”時,對 DialectResolutionInfo 的訪問不能為空
以下是我的application.properties中的資料庫和休眠相關設定:
# ==============================
# = 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 的依賴項以及其他必需的依賴項:
...
<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/中需要閱讀。我的包結構如下:
project
- dataconfig
- db2
- config
- entity
- repository
- oracle
- config
- entity
- repository
我還添加了一些物體和存盤庫以及我的配置類。
這是我的DB2Configuration類:
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類:
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檔案中添加 oracle 相關設定之前,我的應用程式僅使用上述 DB2 設定作業。
添加 oracle 相關設定和配置后,我開始收到此錯誤:
org.hibernate.HibernateException:當未設定“hibernate.dialect”時,對 DialectResolutionInfo 的訪問不能為空
根據錯誤,我認為問題是由于我在application.properties檔案中對 Hibernate 方言的設定引起的。我認為這是由兩種設定之一引起的
...
db2.jpa.properties.hibernate.dialect=org.hibernate.dialect.DB2390Dialect
...
oracle.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
我該如何解決這個問題?
uj5u.com熱心網友回復:
我想通了。
修改entityManagerFactory兩者的方法Db2Configuration并OracleConfiguration為它們提供有關休眠方言的資訊:
對于 DB2
@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();
}
甲骨文
@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();
}
之后,我的控制臺在運行應用程式時顯示,表明一切正常:
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'
我的執行器/健康端點也看到兩個資料庫都已啟動并正在運行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/483683.html
