程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在Spring Boot中创建多个数据源和架构大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在Spring Boot中创建多个数据源和架构?

开发过程中遇到在Spring Boot中创建多个数据源和架构的问题如何解决?下面主要结合日常开发的经验,给出你关于在Spring Boot中创建多个数据源和架构的解决方法建议,希望对你解决在Spring Boot中创建多个数据源和架构有所启发或帮助;

spring.jpa.hibernate.ddl-auto=create之所以停止工作,不是因为你有两个DataSource,而是因为你的应用程序正在创建自己LocalContainerEntityManagerfactorybean的。这具有禁用a的自动配置的效果,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();
}

解决方法

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

  1. 有两个数据源的地方spring.jpa.hibernate.ddl-auto=create似乎无法在我的Spring Boot应用程序spring.jpa.generate-ddl=true中工作,请立即执行此操作

  2. 我无法为每个数据源选择自动创建策略。我宁愿为数据源一创建模式,而仅在第二个DB中将数据源为二使用创建的模式。

任何机构都知道如何解决这些问题?注意如果可能的话,我不想完全放弃自动配置。我什至还不知道,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;
        }
    }

大佬总结

以上是大佬教程为你收集整理的在Spring Boot中创建多个数据源和架构全部内容,希望文章能够帮你解决在Spring Boot中创建多个数据源和架构所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: