Spring Boot中的多数据源和模式创建
我用的是弹簧靴。我最终设法设置了两个数据源,但现在我面临另一个问题Spring Boot中的多数据源和模式创建,spring,hibernate,jpa,datasource,spring-boot,Spring,Hibernate,Jpa,Datasource,Spring Boot,我用的是弹簧靴。我最终设法设置了两个数据源,但现在我面临另一个问题 有了两个数据源,spring.jpa.hibernate.ddl auto=create似乎在我的spring启动应用程序中停止工作,只有spring.jpa.generate ddl=true现在就开始工作 我无法为每个数据源选择自动创建策略。我更愿意为数据源1创建模式,只需在第二个DB中使用数据源2创建的模式 有谁知道如何解决这些问题?注意,如果可能的话,我不想完全放弃自动配置。我甚至不知道hibernate是否能够在一个持
spring.jpa.hibernate.ddl auto=create
似乎在我的spring启动应用程序中停止工作,只有spring.jpa.generate ddl=true
现在就开始工作spring.datasource internal.url=jdbc:hsqldb:mem:testdb
spring.datasource internal.username=sa
spring.datasource internal.password=sa
spring.datasource internal.driver类名=org.hsqldb.jdbcDriver
spring.datasource internal.jpa.database platform=org.hibernate.dialen.hsqldiante
spring.datasourceexternal.url=jdbc:hsqldb:mem:testexternal
spring.datasource external.username=sa
spring.datasource external.password=sa
spring.datasource external.driver类名=org.hsqldb.jdbcDriver
spring.datasource external.jpa.database platform=org.hibernate.dialen.hsqldiante
flyway.enabled=false
spring.jpa.hibernate.ddl auto=create
spring.jpa.show sql=true
spring.jpa.generate ddl=true
数据库内部配置
@配置
@启用事务管理
@EnableJpaRepositories(basePackages=“cz.data.internal”,
entityManagerFactoryRef=“internalEntityManagerFactory”,
transactionManagerRef=“internalTransactionManager”)
公共类DBConfigInternal{
公共静态最终字符串INTERNAL=“INTERNAL”;
@Bean(name=“internalDataSource”)
@初级的
@ConfigurationProperties(前缀=“spring.datasource internal”)
公共数据源internalDataSource(){
返回DataSourceBuilder.create().build();
}
@Bean(name=“internalEntityManagerFactory”)
@初级的
公共LocalContainerEntityManagerFactoryBean内部实体管理器工厂(
EntityManagerFactoryBuilder(建筑商){
返回生成器
.dataSource(internalDataSource())
.packages(“cz.data.internal.entity”)
.persistenceUnit(内部)
.build();
}
@Bean(name=“internalTransactionManager”)
@初级的
公共平台TransactionManager internalTransactionManager(){
JpaTransactionManager JpaTransactionManager=新的JpaTransactionManager();
setDataSource(internalDataSource());
jpaTransactionManager.setPersistenceUnitName(内部);
返回jpaTransactionManager;
}
}
DBExternalConfig
@配置
@启用事务管理
@授权代理(
basePackages=“cz.data.external”,
entityManagerFactoryRef=“externalEntityManagerFactory”,
transactionManagerRef=“externalTransactionManager”)
公共类DBConfigExternal{
公共静态最终字符串EXTERNAL=“EXTERNAL”;
@Bean(name=“externalDataSource”)
@ConfigurationProperties(前缀=“spring.datasource external”)
公共数据源externalDataSource(){
返回DataSourceBuilder.create().build();
}
@Bean(name=“externalEntityManagerFactory”)
公共LocalContainerEntityManagerFactoryBean外部实体管理器工厂(
EntityManagerFactoryBuilder(建筑商){
返回生成器
.dataSource(externalDataSource())
.packages(“cz.data.external.entity”)
.persistenceUnit(外部)
.build();
}
@Bean(name=“externalTransactionManager”)
公共平台TransactionManager外部事务管理器(){
JpaTransactionManager JpaTransactionManager=新的JpaTransactionManager();
setDataSource(externalDataSource());
jpaTransactionManager.setPersistenceUnitName(外部);
返回jpaTransactionManager;
}
}
M.W.
spring.jpa.hibernate.ddl auto=create
停止工作,不是因为您有两个数据源,而是因为您的应用程序正在创建自己的LocalContainerEntityManagerFactoryBean
s。这会禁用LocalContainerEntityManagerFactoryBean的自动配置,因此您现在必须自己配置它
您可以将两个实体管理器配置为具有如下不同的模式生成行为(第一个执行更新,第二个执行创建):
@Bean(name=“externalEntityManagerFactory”)
公共LocalContainerEntityManagerFactoryBean外部实体管理器工厂(
EntityManagerFactoryBuilder(建筑商){
映射属性=新的HashMap();
properties.put(“hibernate.hbm2ddl.auto”、“update”);
返回生成器
.dataSource(externalDataSource())
.packages(“cz.data.external.entity”)
.persistenceUnit(外部)
.物业(物业)
.build();
}
@Bean(name=“internalEntityManagerFactory”)
@初级的
公共LocalContainerEntityManagerFactoryBean内部实体管理器工厂(
EntityManagerFactoryBuilder(建筑商){
映射属性=新的HashMap();
properties.put(“hibernate.hbm2ddl.auto”、“create”);
返回生成器
.dataSource(internalDataSource())
.packages(“cz.data.internal.entity”)
.persistenceUnit(内部)
.物业(物业)
.build();
}
@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();
}