programing

Spring Boot에서 여러 데이터 소스 및 스키마

lovecodes 2023. 3. 26. 12:16
반응형

Spring Boot에서 여러 데이터 소스 및 스키마

스프링 부츠를 쓰고 있어요.드디어 2개의 데이터 소스를 셋업 할 수 있었습니다만, 또 다른 문제에 직면하고 있습니다.

  1. 2개의 데이터 소스를 사용하여spring.jpa.hibernate.ddl-auto=create스프링 부트 어플리케이션에서 동작이 정지된 것 같습니다만,spring.jpa.generate-ddl=true지금 당장 그 일을 해라

  2. 각 데이터 소스의 자동 생성 전략을 선택할 수 없습니다.데이터 소스 1의 스키마를 만들고 데이터 소스 2의 두 번째 DB에서 생성된 스키마를 사용하는 것이 좋습니다.

이 문제를 어떻게 해결할지 아는 사람?주의: 가능하면 auto-config를 완전히 폐기하고 싶지는 않습니다.하이버네이트가 하나의 지속성 단위로 스키마를 초기화할 수 있는지도 아직 모르겠어요.

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

DBInternal Config(DBInternal Config)


    @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;
        }
    }

DBExternal Config(DBExternal Config)


    @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두 개의 DataSources가 있기 때문이 아니라 응용 프로그램이 자체 DataSources를 만들고 있기 때문에 작동이 중지되었습니다.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();
}

언급URL : https://stackoverflow.com/questions/28275448/multiple-data-source-and-schema-creation-in-spring-boot

반응형