Я занимаюсь разработкой весеннего загрузочного приложения, которое подключается к 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 только для любого имени метода, толькосоздаются вторичные таблицы базы данных.
Я пробовал решение в Множественные конфигурации ликвазы при весенней загрузке , но все еще не повезло.
Мой вопрос заключается в том, как заставить генерацию жидкости.таблицы для первичных и вторичных баз данных?