Почему весенняя загрузка / данные не могут автоматически настроить несколько источников данных? - PullRequest
0 голосов
/ 19 февраля 2019

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

Моя структура пакета выглядит следующим образом

- db
  - bar
    - BarDbConfig.java
    - domain
      - BarModel.java
    - repo
      - BarRepo.java
  - foo
    - FooDbConfig.java
    - domain
      - FooModel.java
    - repo
      - FooRepo.java

application.properties

spring.jpa.database=default
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

#first db
bar.datasource.jdbc-url=jdbc:h2:C:\\Project\\com.example\\db3.data
bar.datasource.username=admin
bar.datasource.password=admin
bar.datasource.driver-class-name=org.h2.Driver

#second db
foo.datasource.jdbc-url=jdbc:h2:C:\\Project\\com.example\\db2.data
foo.datasource.username=admin
foo.datasource.password=admin
foo.datasource.driver-class-name=org.h2.Driver

BarDbConfig.java

@Configuration
@EnableJpaRepositories(
        entityManagerFactoryRef = "barEntityManagerFactory",
        transactionManagerRef = "barTransactionManager"
)
public class BarDbConfig {

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "bar.datasource")
    public DataSource barDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean barEntityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("barDataSource") DataSource dataSource
    ) {
        return builder.dataSource(dataSource)
                .packages(BarDbConfig.class.getPackage().getName())
                .persistenceUnit("barPersistenceUnit")
                .build();
    }

    @Primary
    @Bean
    public PlatformTransactionManager barTransactionManager(
            @Qualifier("barEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

FooDbConfig.java

@Configuration
@EnableJpaRepositories(
        entityManagerFactoryRef = "fooEntityManagerFactory",
        transactionManagerRef = "fooTransactionManager"
)
public class FooDbConfig {

    @Bean
    @ConfigurationProperties(prefix = "foo.datasource")
    public DataSource fooDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean fooEntityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("fooDataSource") DataSource dataSource
    ) {
        return builder.dataSource(dataSource)
                .packages(FooDbConfig.class.getPackage().getName())
                .persistenceUnit("fooPersistenceUnit")
                .build();
    }

    @Bean
    public PlatformTransactionManager fooTransactionManager(
            @Qualifier("fooEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

Однако мне было интересно, действительно ли необходим весь этот шаблонный код?

  • Нет ли способа удалить всеLocalContainerEntityManagerFactoryBean и PlatformTransactionManager материал?
  • Есть ли какая-либо причина, по которой необходимо предоставить все эти явные Qualifier -имя?
  • Не удается найти при загрузке и автоматически настроитьсами источники данных ??
  • Каким будет абсолютный минимальный код, необходимый для подключения к двум базам данных с использованием соглашения о конфигурации?

1 Ответ

0 голосов
/ 20 февраля 2019

Я просто собираюсь ответить на один вопрос, который вы задаете в заголовке, а затем снова в теле вашего вопроса:

Не удается найти при начальной загрузке и автоматически настроить DataSource sсамо по себе?

99% приложений используют одну базу данных, и в этих случаях вполне очевидно, что вы хотите, и именно так Boot делает для вас.

Если у вас 2 базы данныхв вашем приложении есть много вопросов, на которые нет разумных ответов по умолчанию:

Какие репозитории следует использовать, какие DataSource?Разделить на пакет?Есть два репозитория для каждого интерфейса?Есть маршрутизация DataSource?По какому критерию следует направлять запросы?

Хотите ли вы одну транзакцию из нескольких DataSource с или отдельных?Или, может быть, оба для разных вариантов использования?

Конечно, Boot может выбрать один из возможных ответов на все эти вопросы, но результат будет полезен только для небольшого подмножества уже небольшой группы разработчиков.Поэтому это не сделано.

Конечно, если вы найдете что-то, что почти всегда выполняется определенным образом, я уверен, что разработчики Spring Boot оценят запрос на добавление функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...