[SPRING] Spring Boot에서 다중 데이터 소스와 스키마 생성
SPRINGSpring 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.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(); }
from https://stackoverflow.com/questions/28275448/multiple-data-source-and-schema-creation-in-spring-boot by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] JUnitTest의 @ControllerAdvice 주석이 달린 컨트롤러를 MockMVC에 등록하십시오. (0) | 2019.03.24 |
---|---|
[SPRING] 'hibernate.dialect'가 설정되어 있지 않으면 Connection은 null이 될 수 없다. (0) | 2019.03.24 |
[SPRING] 다른 패키지의 @RestController가 작동하지 않습니다. (0) | 2019.03.24 |
[SPRING] Inner 클래스의 Spring Bean을 생성하는 방법? (0) | 2019.03.24 |
[SPRING] Spring의 @Scheduled 오류 : 컨텍스트 내에 하나의 AsyncAnnotationBeanPostProcessor 만 존재할 수 있습니다. (0) | 2019.03.24 |