从 HibernateJpaAutoConfiguration 中排除某些数据源

Exclude certain DataSource(s) from HibernateJpaAutoConfiguration

我有一个包含 2 个数据源的项目。一个用于 PostgreSQL,另一个用于 ClickHouse。目前没问题。

我打算仅通过 JDBC 将 ClickHouse 与本机 SQL 一起使用。

但我想将基于 JPA 的存储库与 PostgreSQL 数据源一起使用。如果我添加 spring-boot-starter-data-jpa 依赖项,HibernateJpaAutoConfiguration 会启动 ALL 已注册的数据源 bean。 ClickHouse 不是事务性关系数据库,其 JDBC 实现非常有限且基础,从未打算与 Hibernate 一起使用。 所以我的问题是:是否可以对两个数据源使用 DataSourceAutoConfiguration,但不知何故告诉 HibernateJpaAutoConfiguration 仅使用 PostgreSQL 数据源进行配置?

我仍然想使用自动配置好东西,比如 DataSource 配置和连接池,在属性文件中几乎只有几行。我知道我可以完全排除 HibernateJpaAutoConfiguration 并自行配置所有内容(entityManager、transactionManager ...),但我想尽可能避免这种情况。只是告诉它避免配置 ClickHouse 数据源似乎更优雅。


更新

我的一些假设是不正确的。阅读接受的答案。很有见地。

DataSourceAutoConfiguration 只有在您没有为数据源定义任何 beans 时才会启动。然后它将根据 application.properties 中配置的设置仅创建和配置一个数据源。这意味着如果你需要创建两个数据源,它不能用于这种情况,你必须手动定义两个数据源。可以参考docs模拟DataSourceAutoConfiguration.

配置多数据源的方法

另一方面,HibernateJpaAutoConfiguration 只有在定义了一个 Datasource bean 时才会启动(请参阅 codes,因为它标有 @ConditionalOnSingleCandidate

并且来自@ConditionalOnSingleCandidatejavadoc

@Conditional that only matches when a bean of the specified class is already contained in the BeanFactory and a single candidate can be determined.

The condition will also match if multiple matching bean instances are already contained in the BeanFactory but a primary candidate has been defined; essentially, the condition match if auto-wiring a bean with the defined type will succeed.

这意味着您可以简单地用 @Primary 标记您为 PostgreSQL 定义的 DataSource bean,并且 HibernateJpaAutoConfiguration 应该只考虑它而忽略其他的。