복붙노트

[SPRING] Spring Boot에서 다중 데이터 소스와 스키마 생성

SPRING

Spring Boot에서 다중 데이터 소스와 스키마 생성

나는 Spring Boot를 사용하고있다. 나는 마침내 두 개의 데이터 소스를 설정할 수 있었지만 지금은 또 다른 문제에 직면하고 있습니다.

어떤 신체든지이 문제점을 해결하는 방법을 알고 있습니까? 참고 가능하다면 자동 설정을 완전히 버리고 싶지는 않습니다. 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.

해결법

  1. ==============================

    1.spring.jpa.hibernate.ddl-auto = create가 작동을 멈췄습니다. 왜냐하면 두 개의 DataSource가 있기 때문이 아니라 응용 프로그램이 자체 LocalContainerEntityManagerFactoryBeans를 만들기 때문입니다. 이것은 LocalContainerEntityManagerFactoryBean의 자동 구성을 비활성화하는 효과가 있으므로 이제 직접 구성해야합니다.

    spring.jpa.hibernate.ddl-auto = create가 작동을 멈췄습니다. 왜냐하면 두 개의 DataSource가 있기 때문이 아니라 응용 프로그램이 자체 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();
    }
    
  2. from https://stackoverflow.com/questions/28275448/multiple-data-source-and-schema-creation-in-spring-boot by cc-by-sa and MIT license