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

标签 spring hibernate jpa datasource spring-boot

我正在使用 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 已停止工作,不是因为您有两个 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();
}

关于spring - Spring Boot 中的多个数据源和模式创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28275448/

相关文章:

spring - 在 Spring 使用@Schedule

java - 如何在spring webapp中创建后台进程?

java - 在 Spring Context 中实例化的 JsonIdentityInfo Resolver

mysql - 即使在 application-context.xml 中显式指定,hibernate session 也会返回 null

java - 更新jpa中的实体

java - 并发请求失败 - "Session is closed!"

hibernate - hibernate是在内部使用jdbc还是在内部使用JTA,或者它是可配置的?”

Hibernate Criteria join 查询一对多

hibernate - java.lang.NoClassDefFoundError : org/hibernate/boot/registry/classloading/spi/ClassLoaderService 错误

java - 将 Spring boot JPA(MySQL) 迁移到 JPA(PostgreSQL) 会引发错误