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

Spring Boot中的多数据源和模式创建,spring,hibernate,jpa,datasource,spring-boot,Spring,Hibernate,Jpa,Datasource,Spring Boot,我用的是弹簧靴。我最终设法设置了两个数据源,但现在我面临另一个问题 有了两个数据源,spring.jpa.hibernate.ddl auto=create似乎在我的spring启动应用程序中停止工作,只有spring.jpa.generate ddl=true现在就开始工作 我无法为每个数据源选择自动创建策略。我更愿意为数据源1创建模式,只需在第二个DB中使用数据源2创建的模式 有谁知道如何解决这些问题?注意,如果可能的话,我不想完全放弃自动配置。我甚至不知道hibernate是否能够在一个持

我用的是弹簧靴。我最终设法设置了两个数据源,但现在我面临另一个问题

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

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

  • 有谁知道如何解决这些问题?注意,如果可能的话,我不想完全放弃自动配置。我甚至不知道hibernate是否能够在一个持久化单元中初始化模式

    应用程序属性

    spring.datasource internal.url=jdbc:hsqldb:mem:testdb
    spring.datasource internal.username=sa
    spring.datasource internal.password=sa
    spring.datasource internal.driver类名=org.hsqldb.jdbcDriver
    spring.datasource internal.jpa.database platform=org.hibernate.dialen.hsqldiante
    spring.datasourceexternal.url=jdbc:hsqldb:mem:testexternal
    spring.datasource external.username=sa
    spring.datasource external.password=sa
    spring.datasource external.driver类名=org.hsqldb.jdbcDriver
    spring.datasource external.jpa.database platform=org.hibernate.dialen.hsqldiante
    flyway.enabled=false
    spring.jpa.hibernate.ddl auto=create
    spring.jpa.show sql=true
    spring.jpa.generate ddl=true
    
    数据库内部配置

    
    @配置
    @启用事务管理
    @EnableJpaRepositories(basePackages=“cz.data.internal”,
    entityManagerFactoryRef=“internalEntityManagerFactory”,
    transactionManagerRef=“internalTransactionManager”)
    公共类DBConfigInternal{
    公共静态最终字符串INTERNAL=“INTERNAL”;
    @Bean(name=“internalDataSource”)
    @初级的
    @ConfigurationProperties(前缀=“spring.datasource internal”)
    公共数据源internalDataSource(){
    返回DataSourceBuilder.create().build();
    }
    @Bean(name=“internalEntityManagerFactory”)
    @初级的
    公共LocalContainerEntityManagerFactoryBean内部实体管理器工厂(
    EntityManagerFactoryBuilder(建筑商){
    返回生成器
    .dataSource(internalDataSource())
    .packages(“cz.data.internal.entity”)
    .persistenceUnit(内部)
    .build();
    }
    @Bean(name=“internalTransactionManager”)
    @初级的
    公共平台TransactionManager internalTransactionManager(){
    JpaTransactionManager JpaTransactionManager=新的JpaTransactionManager();
    setDataSource(internalDataSource());
    jpaTransactionManager.setPersistenceUnitName(内部);
    返回jpaTransactionManager;
    }
    }
    
    DBExternalConfig

    
    @配置
    @启用事务管理
    @授权代理(
    basePackages=“cz.data.external”,
    entityManagerFactoryRef=“externalEntityManagerFactory”,
    transactionManagerRef=“externalTransactionManager”)
    公共类DBConfigExternal{
    公共静态最终字符串EXTERNAL=“EXTERNAL”;
    @Bean(name=“externalDataSource”)
    @ConfigurationProperties(前缀=“spring.datasource external”)
    公共数据源externalDataSource(){
    返回DataSourceBuilder.create().build();
    }
    @Bean(name=“externalEntityManagerFactory”)
    公共LocalContainerEntityManagerFactoryBean外部实体管理器工厂(
    EntityManagerFactoryBuilder(建筑商){
    返回生成器
    .dataSource(externalDataSource())
    .packages(“cz.data.external.entity”)
    .persistenceUnit(外部)
    .build();
    }
    @Bean(name=“externalTransactionManager”)
    公共平台TransactionManager外部事务管理器(){
    JpaTransactionManager JpaTransactionManager=新的JpaTransactionManager();
    setDataSource(externalDataSource());
    jpaTransactionManager.setPersistenceUnitName(外部);
    返回jpaTransactionManager;
    }
    }
    

    M.W.

    spring.jpa.hibernate.ddl auto=create
    停止工作,不是因为您有两个数据源,而是因为您的应用程序正在创建自己的
    LocalContainerEntityManagerFactoryBean
    s。这会禁用
    LocalContainerEntityManagerFactoryBean的自动配置,因此您现在必须自己配置它

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

    @Bean(name=“externalEntityManagerFactory”)
    公共LocalContainerEntityManagerFactoryBean外部实体管理器工厂(
    EntityManagerFactoryBuilder(建筑商){
    映射属性=新的HashMap();
    properties.put(“hibernate.hbm2ddl.auto”、“update”);
    返回生成器
    .dataSource(externalDataSource())
    .packages(“cz.data.external.entity”)
    .persistenceUnit(外部)
    .物业(物业)
    .build();
    }
    @Bean(name=“internalEntityManagerFactory”)
    @初级的
    公共LocalContainerEntityManagerFactoryBean内部实体管理器工厂(
    EntityManagerFactoryBuilder(建筑商){
    映射属性=新的HashMap();
    properties.put(“hibernate.hbm2ddl.auto”、“create”);
    返回生成器
    .dataSource(internalDataSource())
    .packages(“cz.data.internal.entity”)
    .persistenceUnit(内部)
    .物业(物业)
    .build();
    }
    
    @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();
    }