Как загрузить свойства spring.jpa / mvc из application.yaml в пользовательский PesistenceContext для архитектуры MultiTenant Db - PullRequest
0 голосов
/ 14 марта 2020

У меня есть требование для создания службы REST, которая будет работать с различными экземплярами БД в зависимости от номера экземпляра БД в запросе. Я реализовал это согласно этой статье , и это работает. Но в этом примере я вижу, как добавить свойства для разных БД из файла, но этот реквизит только app.datasource. У меня есть другие реквизиты, которые являются общими для каждого источника данных, и я хочу добавить их из файла, а не в жестком кодировании в bean-компоненте.

Моя конфигурация выглядит так:

spring:
datasource:
    fr:
        jdbc-url: val
        username: val
        password: val
    de:
        jdbc-url: val
        username: val
        password: val
    us:
        jdbc-url: val
        username: val
        password: val
jpa:
    properties:
        hibernate:
            dialect: val
            format_sql: true
    show-sql: true
mvc:
    throw-exception-if-no-handler-found: true
resources:
    add-mappings: false here

А также конфигурация с bean-компонентами :

 @Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        basePackages = "val",
        entityManagerFactoryRef = "multiEntityManager",
        transactionManagerRef = "multiTransactionManager"
)
public class PersistenceConfiguration {

    private final String MODEL_PACKAGE_SCAN = "val";

    @Primary
    @Bean(name = "frDataSource")
    @ConfigurationProperties("spring.datasource.fr")
    public DataSource frDataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Bean(name = "deDataSource")
    @ConfigurationProperties("spring.datasource.de")
    public DataSource deDataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Bean(name = "usDataSource")
    @ConfigurationProperties("spring.datasource.us")
    public DataSource usDataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Bean(name = "multiRoutingDataSource")
    public DataSource multiRoutingDataSource() {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DBInstanceNum.FR, frDataSource());
        targetDataSources.put(DBInstanceNum.DE, deDataSource());
        targetDataSources.put(DBInstanceNum.US, usDataSource());
        MultiRoutingDataSource multiRoutingDataSource = new MultiRoutingDataSource();
        multiRoutingDataSource.setDefaultTargetDataSource(frDataSource());
        multiRoutingDataSource.setTargetDataSources(targetDataSources);
        return multiRoutingDataSource;
    }

    @Bean(name = "multiEntityManager")
    public LocalContainerEntityManagerFactoryBean multiEntityManager() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(multiRoutingDataSource());
        em.setPackagesToScan(MODEL_PACKAGE_SCAN);
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(hibernateProperties());
        return em;
    }

    @Bean(name = "multiTransactionManager")
    public PlatformTransactionManager multiTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(multiEntityManager().getObject());
        return transactionManager;
    }

    @Primary
    @Bean(name = "dbSessionFactory")
    public LocalSessionFactoryBean dbSessionFactory() {
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
        sessionFactoryBean.setDataSource(multiRoutingDataSource());
        sessionFactoryBean.setPackagesToScan(MODEL_PACKAGE_SCAN);
        sessionFactoryBean.setHibernateProperties(hibernateProperties());
        return sessionFactoryBean;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
//      properties.put("hibernate.show_sql", true);
//      properties.put("hibernate.format_sql", true);
        return properties;
    }
}

Я не хочу жестко кодировать значения в hibernateProperties (). Как я могу разобрать и установить их из файла?

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