从 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
)
并且来自@ConditionalOnSingleCandidate
的javadoc:
@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
应该只考虑它而忽略其他的。
我有一个包含 2 个数据源的项目。一个用于 PostgreSQL,另一个用于 ClickHouse。目前没问题。
我打算仅通过 JDBC 将 ClickHouse 与本机 SQL 一起使用。
但我想将基于 JPA 的存储库与 PostgreSQL 数据源一起使用。如果我添加 spring-boot-starter-data-jpa
依赖项,。 ClickHouse 不是事务性关系数据库,其 JDBC 实现非常有限且基础,从未打算与 Hibernate 一起使用。 所以我的问题是:是否可以对两个数据源使用 HibernateJpaAutoConfiguration
会启动 ALL 已注册的数据源 beanDataSourceAutoConfiguration
,但不知何故告诉 HibernateJpaAutoConfiguration
仅使用 PostgreSQL 数据源进行配置?
我仍然想使用自动配置好东西,比如 DataSource 配置和连接池,在属性文件中几乎只有几行。我知道我可以完全排除 HibernateJpaAutoConfiguration
并自行配置所有内容(entityManager、transactionManager ...),但我想尽可能避免这种情况。只是告诉它避免配置 ClickHouse 数据源似乎更优雅。
更新
我的一些假设是不正确的。阅读接受的答案。很有见地。
DataSourceAutoConfiguration
只有在您没有为数据源定义任何 beans 时才会启动。然后它将根据 application.properties
中配置的设置仅创建和配置一个数据源。这意味着如果你需要创建两个数据源,它不能用于这种情况,你必须手动定义两个数据源。可以参考docs模拟DataSourceAutoConfiguration
.
另一方面,HibernateJpaAutoConfiguration
只有在定义了一个 Datasource
bean 时才会启动(请参阅 codes,因为它标有 @ConditionalOnSingleCandidate
)
并且来自@ConditionalOnSingleCandidate
的javadoc:
@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
应该只考虑它而忽略其他的。