首页 文章

Spring Boot中的多个数据源和模式创建

提问于
浏览
18

我正在使用Spring Boot . 我终于设法设置了两个数据源,但现在我面临另一个问题 .

  • 有两个数据源 spring.jpa.hibernate.ddl-auto=create 似乎停止在我的 Spring 季启动应用程序中工作,只有 spring.jpa.generate-ddl=true 现在就完成工作

  • 我无法为每个数据源选择自动创建策略 . 我更愿意为数据源1创建模式,只使用第二个数据库中创建的模式和数据源2 .

任何机构都知道如何解决这些问题?注意我不想在可能的情况下完全丢弃自动配置 . 我还不知道,如果hibernate能够在一个持久性单元中初始化模式 .

application.properties

spring.datasource-internal.url=jdbc:hsqldb:mem:testdb
spring.datasource-internal.username=sa
spring.datasource-internal.password=sa
spring.datasource-internal.driver-class-name=org.hsqldb.jdbcDriver
spring.datasource-internal.jpa.database-platform=org.hibernate.dialect.HSQLDialect

spring.datasource-external.url=jdbc:hsqldb:mem:testexternal
spring.datasource-external.username=sa
spring.datasource-external.password=sa
spring.datasource-external.driver-class-name=org.hsqldb.jdbcDriver
spring.datasource-external.jpa.database-platform=org.hibernate.dialect.HSQLDialect

flyway.enabled=false
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true

DBInternalConfig

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "cz.data.internal",
        entityManagerFactoryRef = "internalEntityManagerFactory",
        transactionManagerRef = "internalTransactionManager")
public class DBConfigInternal {


    public static final String INTERNAL = "internal";

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

    @Bean(name = "internalEntityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(internalDataSource())
                .packages("cz.data.internal.entity")
                .persistenceUnit(INTERNAL)
                .build();
    }

    @Bean(name = "internalTransactionManager")
    @Primary
    public PlatformTransactionManager internalTransactionManager() {
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setDataSource(internalDataSource());
        jpaTransactionManager.setPersistenceUnitName(INTERNAL);
        return jpaTransactionManager;
    }
}

DBExternalConfig

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        basePackages = "cz.data.external",
        entityManagerFactoryRef = "externalEntityManagerFactory",
        transactionManagerRef = "externalTransactionManager")
public class DBConfigExternal {


    public static final String EXTERNAL = "external";

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

    @Bean(name = "externalEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean externalEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(externalDataSource())
                .packages("cz.data.external.entity")
                .persistenceUnit(EXTERNAL)
                .build();
    }

    @Bean(name = "externalTransactionManager")
    public PlatformTransactionManager externalTransactionManager() {
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setDataSource(externalDataSource());
        jpaTransactionManager.setPersistenceUnitName(EXTERNAL);
        return jpaTransactionManager;
    }
}

M.W.

1 回答

  • 19

    spring.jpa.hibernate.ddl-auto=create 已停止工作,不是因为您有两个DataSource,而是因为您的应用程序正在创建自己的 LocalContainerEntityManagerFactoryBean . 这具有禁用 LocalContainerEntityManagerFactoryBean 的自动配置的效果,因此您现在必须自己配置它 .

    您可以将两个实体管理器配置为具有不同的模式生成行为(第一个执行更新,第二个执行创建):

    @Bean(name = "externalEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean externalEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
        Map<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", "update");
        return builder
                .dataSource(externalDataSource())
                .packages("cz.data.external.entity")
                .persistenceUnit(EXTERNAL)
                .properties(properties)
                .build();
    }
    
    @Bean(name = "internalEntityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
        Map<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", "create");
        return builder
                .dataSource(internalDataSource())
                .packages("cz.data.internal.entity")
                .persistenceUnit(INTERNAL)
                .properties(properties)
                .build();
    }
    

相关问题