Spring boot: настройте два источника данных в одном пакете

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

Это моя конфигурация:

@Configuration
@EnableAutoConfiguration
public class NwlConfiguration {

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource")
    public DataSourceProperties source1DataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = "source1")
    @Primary
    @ConfigurationProperties("spring.datasource")
    public DataSource source1DataSource() {
        return source1DataSourceProperties().initializeDataSourceBuilder().build();
    }

    @Bean
    @ConfigurationProperties("source2.datasource")
    public DataSourceProperties source2DataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = "source2")
    @ConfigurationProperties("source2.datasource")
    public DataSource source2DataSource() {
        return source2DataSourceProperties().initializeDataSourceBuilder().build();
    }

}

С какой проблемой вы столкнулись? Вы получаете какую-либо ошибку с приведенной выше конфигурацией?

Sheetal Mohan Sharma 06.08.2018 16:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
762
1

Ответы 1

Ваша конфигурация выглядит нормально. Единственное, что вам нужно - указать, какая конфигурация будет использоваться для какого репозитория.

Если есть несколько сущностей, вы можете поместить их в общий пакет.

Как это

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "barEntityManagerFactory",
    transactionManagerRef = "barTransactionManager", basePackages = {"com.foobar.bar.repo"})
public class BarDbConfig {

Полный код

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "barEntityManagerFactory",
    transactionManagerRef = "barTransactionManager", basePackages = {"com.foobar.bar.repo"})
public class BarDbConfig {

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

  @Bean(name = "barEntityManagerFactory")
  public LocalContainerEntityManagerFactoryBean barEntityManagerFactory(
      EntityManagerFactoryBuilder builder, @Qualifier("barDataSource") DataSource dataSource) {
    return builder.dataSource(dataSource).packages("com.foobar.bar.domain").persistenceUnit("bar")
        .build();
  }

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

}

2-й класс конфигурации источника данных

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory",
    basePackages = {"com.foobar.foo.repo"})
public class FooDbConfig {

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

  @Primary
  @Bean(name = "entityManagerFactory")
  public LocalContainerEntityManagerFactoryBean entityManagerFactory(
      EntityManagerFactoryBuilder builder, @Qualifier("dataSource") DataSource dataSource) {
    return builder.dataSource(dataSource).packages("com.foobar.foo.domain").persistenceUnit("foo")
        .build();
  }

  @Primary
  @Bean(name = "transactionManager")
  public PlatformTransactionManager transactionManager(
      @Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
    return new JpaTransactionManager(entityManagerFactory);
  }
}

Обратитесь к эта статья для получения более подробной информации

Я думаю, вы не понимаете мою проблему, я не хочу разделять объекты на два пакета, потому что у меня одинаковые объекты в двух базах данных. Поэтому мне нужен способ сообщить Spring, что репозиторий будет использовать этот источник данных, но объединить все репозитории и объекты в один пакет, например com.foobar.repo.

Ayoub Mk 03.08.2018 16:02

Другие вопросы по теме