【问题标题】:Multiple data source and schema creation in Spring BootSpring Boot 中的多数据源和模式创建
【发布时间】:2015-04-01 06:19:53
【问题描述】:

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

  1. 有两个数据源 spring.jpa.hibernate.ddl-auto=create 似乎在我的 Spring Boot 应用程序中停止工作,现在只有 spring.jpa.generate-ddl=true 可以完成这项工作

  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.

【问题讨论】:

  • spring.jpa.hibernate.ddl-auto=create 没有理由仅仅因为您有两个数据源而停止工作。 Spring Boot 将简单地自动配置 Hibernate 以使用任何 DataSource 为@Primary。我猜你已经添加了一些额外的配置来关闭 Hibernate 的自动配置,但由于你没有提供足够的信息来重新创建你试图解决的问题,所以无法判断。
  • 我添加了一些代码sn-ps。我对这两个选项根本不是很清楚,我几乎看不到它们的设置位置,更不用说它们与代码的确切挂钩位置了。无论如何,对我来说更重要的是第二个问题,如何使其成为特定的数据源。
  • 我知道这个文档。我希望能够使用自动生成,无论如何我看不到为不同的数据源使用不同的 flyway 脚本的选项。我希望能够独立初始化两个数据源。
  • 可能是这样的 stackoverflow.com/a/13625889/2944265 ,需要检查 Spring Boot 是如何喜欢的:-/

标签: spring hibernate jpa datasource spring-boot


【解决方案1】:

spring.jpa.hibernate.ddl-auto=create 已停止工作,不是因为您有两个数据源,而是因为您的应用程序正在创建自己的LocalContainerEntityManagerFactoryBeans。这具有禁用 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();
}

【讨论】:

  • 我听从了你的建议。该应用程序似乎正在运行,但奇怪的是我无法看到 hsqldb 中的表(在内存中),难道我也搞砸了一些事务。所以事务还是打开了,还没有提交?:(
  • 我也收到了很多org.hibernate.tool.hbm2ddl.SchemaExport : user lacks privilege or object not found: PUBLIC.NOTIFICATION
  • 其他link似乎HSQLDB进程不可用
  • 能否添加基于 XML 的配置
  • @Andy - 你能在这里指导我吗:stackoverflow.com/questions/61086749/…
猜你喜欢
  • 2016-09-14
  • 2014-04-10
  • 2016-08-09
  • 2019-08-23
  • 2017-04-17
  • 2018-12-11
  • 2019-03-03
  • 2015-02-21
  • 1970-01-01
相关资源
最近更新 更多