Исключить определенные источники данных из HibernateJpaAutoConfiguration - PullRequest
1 голос
/ 12 апреля 2020

У меня есть проект с 2 источниками данных. Один для PostgreSQL, а другой для ClickHouse. Пока проблем нет.

Я намерен использовать ClickHouse с собственным SQL только через JDB C.

Но я хотел бы использовать репозитории на основе JPA с PostgreSQL источником данных. И если я добавлю spring-boot-starter-data-jpa зависимость, HibernateJpaAutoConfiguration включится для ALL зарегистрированных компонентов DataSource . ClickHouse не является транзакционной реляционной БД, и ее реализация JDB C очень ограничена и базируется c, никогда не предназначенной для использования с Hibernate. Итак, мой вопрос: возможно ли использовать DataSourceAutoConfiguration для обоих источников данных, но как-то сказать HibernateJpaAutoConfiguration для настройки только с PostgreSQL источником данных?

Я все еще хотел бы использовать автоматические настройки, такие как конфигурация DataSource, с пулом соединений с несколькими строками в файле свойств. Я знаю, что могу полностью исключить HibernateJpaAutoConfiguration и настроить все (entityManager, TransactionsManager, ...) самостоятельно, но я хотел бы избежать этого, если это возможно. Просто сказать, что нужно избегать настройки источника данных ClickHouse, кажется более элегантным.


Обновление

Некоторые из моих предположений были неверными. Прочитайте принятый ответ. Это очень проницательно.

1 Ответ

2 голосов
/ 12 апреля 2020

DataSourceAutoConfiguration сработает только в том случае, если вы не определили какие-либо bean-компоненты для источника данных. Затем он создаст и настроит только один источник данных на основе параметра, настроенного в application.properties. Это означает, что если вам нужно создать два источника данных, он не может быть использован для такого случая, и вы должны вручную определить оба источника данных. Вы можете обратиться к документам , чтобы узнать, как настроить несколько источников данных, имитируя то, что делает DataSourceAutoConfiguration.

С другой стороны, HibernateJpaAutoConfiguration будет срабатывать только при наличии определен только один Datasource компонент (см. коды в том виде, как он отмечен @ConditionalOnSingleCandidate)

И из javado c из @ConditionalOnSingleCandidate:

@ Условно, который соответствует, только если бин указанного класса уже содержится в BeanFactory и может быть определен один кандидат.

Условие также будет соответствовать, если несколько совпадающих бинов экземпляры уже содержатся в BeanFactory, но основной кандидат был определен; по существу, условие совпадет, если автоматическое соединение компонента с определенным типом будет успешным.

Это означает, что вы можете просто пометить компонент DataSource, который вы определили для PostgreSQL, с помощью @Primary и HibernateJpaAutoConfiguration следует только учитывать это, но игнорировать других.

...