【发布时间】:2015-04-01 06:19:53
【问题描述】:
我正在使用 Spring Boot。我终于设法设置了两个数据源,但现在我面临另一个问题。
有两个数据源
spring.jpa.hibernate.ddl-auto=create似乎在我的 Spring Boot 应用程序中停止工作,现在只有spring.jpa.generate-ddl=true可以完成这项工作我无法为每个数据源选择自动创建策略。我更愿意为数据源一创建架构,然后将第二个数据库中创建的架构与数据源二一起使用。
任何机构都知道如何解决这些问题?请注意,如果可能的话,我不想完全丢弃自动配置。我什至不知道 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.
【问题讨论】:
-
spring.jpa.hibernate.ddl-auto=create没有理由仅仅因为您有两个数据源而停止工作。 Spring Boot 将简单地自动配置 Hibernate 以使用任何 DataSource 为@Primary。我猜你已经添加了一些额外的配置来关闭 Hibernate 的自动配置,但由于你没有提供足够的信息来重新创建你试图解决的问题,所以无法判断。 -
我添加了一些代码sn-ps。我对这两个选项根本不是很清楚,我几乎看不到它们的设置位置,更不用说它们与代码的确切挂钩位置了。无论如何,对我来说更重要的是第二个问题,如何使其成为特定的数据源。
-
我知道这个文档。我希望能够使用自动生成,无论如何我看不到为不同的数据源使用不同的 flyway 脚本的选项。我希望能够独立初始化两个数据源。
-
可能是这样的 stackoverflow.com/a/13625889/2944265 ,需要检查 Spring Boot 是如何喜欢的:-/
标签: spring hibernate jpa datasource spring-boot