我正在尝试编写一个从两个来源访问数据的应用程序。我正在使用Spring Boot 2.3.2。我查看了一些有关如何配置应用程序的信息的来源:Spring documentation讨论了设置多个数据源的问题,但没有说明如何链接JPA存储库。 Baeldung article的使用范围更广,但我希望利用Spring的自动配置功能。</ p>
到目前为止,我已经创建了一个单独的程序包,添加了一个配置类(以及模型和存储库),并将此程序包包含在scanBasePackages
中,以便将其选中。由于我将拥有多个数据源,因此已将其添加到我的@SpringBootApplication
:
@Bean
@Primary
public DataSourceProperties dataSourceProperties() {
return new DataSourceProperties();
}
这成功使用标准spring配置值加载了我的Spring应用程序。这两个数据库位于不同的服务器上,但是应该共享特征(URL和凭据除外)。
因此,我的辅助配置文件如下所示
@Configuration
@EnableAutoConfiguration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "orgEntityManagerFactory",
transactionManagerRef = "orgTransactionManager",
basePackages = {
"pacage2.repositories"
}
)
public class DataSourceConfiguration {
// added because of this answer: https://stackoverflow.com/a/51305724/167889
@Bean
public EntityManagerFactoryBuilder entityManagerFactoryBuilder() {
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), new HashMap<>(), null);
}
@Bean
@ConfigurationProperties(prefix = "external.datasource")
public DataSourceProperties orgDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
public HikariDataSource orgDataSource(@Qualifier("orgDataSourceProperties") DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().type(HikariDataSource.class)
.build();
}
@Bean
public LocalContainerEntityManagerFactoryBean orgEntityManagerFactory(EntityManagerFactoryBuilder builder,
@Qualifier("orgDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("package2.model")
.build();
}
@Bean
public PlatformTransactionManager orgTransactionManager(
@Qualifier("orgEntityManagerFactory") EntityManagerFactory entityManagerFactory
) {
return new JpaTransactionManager(entityManagerFactory);
}
}
现在,我现在遇到的错误是Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
。但是,我的配置中有该值,并且由Spring自动配置应用。我认为需要在EntityManagerFactoryBuilder
中进行设置,并通过创建自己的设置来应用自动配置。
我怎么也可以吃蛋糕?我想利用Spring提供的强大的自动配置功能来设置数据源并将其连接到适当的存储库。实际上,我要更改的只是URL和凭据,而且我可以将实体和存储库分成一个完全独立的程序包,以便于扫描。