当前位置: 首页 > 面试题库 >

在Spring Boot中创建多个数据源和架构

罗梓
2023-03-14
问题内容

我正在使用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.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();
}


 类似资料:
  • 我正在尝试使用两个数据源与我的SpringBoot应用程序,但无法获得第二个数据源自动连接。我尝试过很多事情,但这是我最接近的一次: 我的Yaml文件: 这是我到目前为止最接近的一次。我之所以说它是最接近的,是因为如果我删除@qualifier,那么我的两个dao方法实际上都可以工作,假设SECOND_SELECT语句对于我的DB1是有效的SQL语句。当我为非主datasouce输入@Qualif

  • 我试图从这里用我当前的应用程序实现数据源代理 我在Spring xml中配置了数据源对象,即在dataSourceProxy对象中传递dataSourceReal。 侦听器和过滤器与文档中一样正确配置。 Spring xml文件: 数据源名称的JNDI名称的xml文件: 我得到了这个错误: 请帮忙。

  • 创建数据源的基本步骤: 在工作区窗口中,点击 “新建数据源”。 输入数据源的名,然后选择所需的连接或现有的数据源。 点击“确定”。 一个选项卡将打开,让你编辑数据源。 将表或查询从连接窗格拖放到设计窗格。 将一个节点拖放到另一个节点以创建联接。 如有需要,请配置联接类型和联接字段。 【提示】创建联接后,你可以随时点击连接器上的联接图标来更改联接设置。 选择“实时”模式或“存档”模式。 点击“应用并

  • 创建数据源的基本步骤: 在工作区窗口中,点击 。 输入数据源的名,然后选择所需的连接或现有的数据源。 点击“好”。 一个选项卡将打开,让你编辑数据源。 将表或查询从连接窗格拖放到设计窗格。 将一个节点拖放到另一个节点以创建联接。 如有需要,请配置联接类型和联接字段。 【提示】创建联接后,你可以随时点击连接器上的联接图标来更改联接设置。 选择“实实时”模式或“存档”模式。 点击“应用并刷新数据”来查

  • 创建数据源的基本步骤: 在工作区窗口中,点击 “新建数据源”。 输入数据源的名,然后选择所需的连接或现有的数据源。 点击“确定”。 一个选项卡将打开,让你编辑数据源。 将表或查询从连接窗格拖放到设计窗格。 将一个节点拖放到另一个节点以创建联接。 如有需要,请配置联接类型和联接字段。 【提示】创建联接后,你可以随时点击连接器上的联接图标来更改联接设置。 选择“实时”模式或“存档”模式。 点击“应用并

  • 当应用程序启动时,我正在尝试创建mysql数据库。我尝试了波纹管配置,但无法实现,如果有人对此有想法,请告诉我,