Генерируется только одна таблица базы данных для нескольких Liquibases и менеджеров сущностей - PullRequest
0 голосов
/ 23 декабря 2018

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

https://www.baeldung.com/spring-data-jpa-multiple-databases

Это хорошо работает на моей стороне.Однако, когда я добавил liquibase для создания начальной схемы для 2 баз данных, можно создать только 1 таблицу базы данных.

Вот мои файлы конфигурации источника данных.

DataConfig.java

@Configuration
public class DataConfig {
    @Value("${hibernate.dialect}")
    private String dialect;
    @Value("${hibernate.hbm2ddl.auto}")
    private String hbm2ddlAuto;
    @Value("${hibernate.show_sql}")
    private boolean showSql;

    protected HikariConfig getHikariConfig(String driver, String url, String username, String password){
        HikariConfig config = new HikariConfig();
        config.setDriverClassName(driver);
        config.setJdbcUrl(url);
        config.setUsername(username);
        config.setPassword(password);
        return new HikariDataSource(config);
    }

    protected Properties getJpaProperties(){
        Properties jpaProperties = new Properties();
        jpaProperties.put(Environment.DIALECT, dialect);
        jpaProperties.put(Environment.HBM2DDL_AUTO, hbm2ddlAuto);
        jpaProperties.put(Environment.SHOW_SQL, showSql);
        return jpaProperties;
    }

    @Bean
    public HibernateJpaVendorAdapter adapter() {
        return new HibernateJpaVendorAdapter();
    }    
}

Конфигурация для первичной базы данных.

DataConfigPrimary.java

package com.dpbg.config;

import liquibase.integration.spring.SpringLiquibase;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.*;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;

import javax.sql.DataSource;

@ComponentScan("com.dpbg.model.primary")
@Configuration
@PropertySource("classpath:application.properties")
@EnableJpaRepositories(basePackages = "com.dpbg.repository.primary", entityManagerFactoryRef = "entityManagerFactoryPrimary", transactionManagerRef = "transactionManagerPrimary")
public class DataConfigPrimary extends DataConfig {

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

    @Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSourcePrimary());
        entityManagerFactoryBean.setPackagesToScan("com.dpbg.model.primary");
        entityManagerFactoryBean.setJpaVendorAdapter(adapter());
        entityManagerFactoryBean.setJpaProperties(getJpaProperties());
        return entityManagerFactoryBean;
    }

    @Bean
    public JpaTransactionManager transactionManagerPrimary() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactoryPrimary().getObject());
        return transactionManager;
    }

    @Profile("!test")
    @Bean
    public SpringLiquibase liquibase() {
        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setDataSource(dataSourcePrimary());
        liquibase.setChangeLog("classpath:db.changelog-master-primary.xml");
        return liquibase;
    }
}

Ниже приведена конфигурация для вторичной базы данных.DataConfigSecondary.java

package com.dpbg.config;

import liquibase.integration.spring.SpringLiquibase;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.*;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;

import javax.sql.DataSource;

@ComponentScan("com.dpbg.model.secondary")
@Configuration
@PropertySource("classpath:application.properties")
@EnableJpaRepositories(basePackages = "com.dpbg.repository.secondary", entityManagerFactoryRef = "entityManagerFactorySecondary", transactionManagerRef = "transactionManagerSecondary")
public class DataConfigSecondary extends DataConfig{

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

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSourceSecondary());
        entityManagerFactoryBean.setPackagesToScan("com.dpbg.model.secondary");
        entityManagerFactoryBean.setJpaVendorAdapter(adapter());
        entityManagerFactoryBean.setJpaProperties(getJpaProperties());
        return entityManagerFactoryBean;
    }

    @Bean
    public JpaTransactionManager transactionManagerSecondary() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactorySecondary().getObject());
        return transactionManager;
    }

    @Profile("!test")
    @Bean
    public SpringLiquibase liquibaseSecondary()  {
        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setDataSource(dataSourceSecondary());
        liquibase.setChangeLog("classpath:db.changelog-master-secondary.xml");
        return liquibase;
    }
}

Генерируются только первичные таблицы базы данных.Кажется, что метод liquibaseSecondary() в DataConfigSecondary.java не вызывается.

Однако, если я переименую liquibaseSecondary() в liquibase(), а затем переименую liquibase() в DataConfigPrimary.java только для любого имени метода, толькосоздаются вторичные таблицы базы данных.

Я пробовал решение в Множественные конфигурации ликвазы при весенней загрузке , но все еще не повезло.

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

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