Spring Boot에서 여러 데이터 소스 및 스키마
스프링 부츠를 쓰고 있어요.드디어 2개의 데이터 소스를 셋업 할 수 있었습니다만, 또 다른 문제에 직면하고 있습니다.
2개의 데이터 소스를 사용하여
spring.jpa.hibernate.ddl-auto=create스프링 부트 어플리케이션에서 동작이 정지된 것 같습니다만,spring.jpa.generate-ddl=true지금 당장 그 일을 해라각 데이터 소스의 자동 생성 전략을 선택할 수 없습니다.데이터 소스 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
'programing' 카테고리의 다른 글
| React와 함께 Redx의 프로바이더를 사용하는 방법 (0) | 2023.03.26 |
|---|---|
| ORA-00932: 일치하지 않는 데이터 유형: 예상됨 - CLOB가 있음 (0) | 2023.03.26 |
| 리액트 라우터:경로를 찾을 수 없습니다. (0) | 2023.03.26 |
| 웹 팩을 사용하여 디렉토리에서 동적으로 이미지 가져오기 (0) | 2023.03.26 |
| Asp에서 Ajax를 사용하여 파일을 업로드하고 있습니다.넷코어 (0) | 2023.03.26 |