spring - Spring boot multiple data source , H2 tables not found
问题描述
Spring boot with muiltiple datasources H2 and Mysql , not creating H2 tables in the console. while accessing the h2 table getting error saying table not found . while checking the console i could confirm that the tables are notg ettting created .
I have two data sources one is ibdemo which uses MySQL and another one is h2.and entity classes are there in the corresponding packages.
Th H2 tables get created while removing the custom data source configuration and try auto configuration, but MySQL tables also get created in H2 database.
I want to use both in my application. These are the properties
## ibdemo proeprties
app.datasource.ibdemo.url=jdbc:mysql://url
app.datasource.ibdemo.username=username
app.datasource.ibdemo.password=password
app.datasource.ibdemo.driver-class-name=com.mysql.jdbc.Driver
## H2 DB properties
spring.h2.console.enabled=true
app.datasource.h2.url=jdbc:h2:mem:testdb
app.datasource.h2.driver-class-name=org.h2.Driver
app.datasource.h2.username=sa
app.datasource.h2.password=
IBDemoDataSource
@Configuration
@EnableJpaRepositories(
entityManagerFactoryRef = "ibDemoEntityManager",
transactionManagerRef = "ibDemoTransactionManager",
basePackages = {"com.cavion.demo.repositories"}
)
public class IBDemoConfig {
@Bean(name = "ibDemoEntityManager")
@Primary
public LocalContainerEntityManagerFactoryBean getIBDemoEntityManager(EntityManagerFactoryBuilder builder,
@Qualifier("ibDemoDataSource") DataSource ibDemoDataSource){
return builder
.dataSource(ibDemoDataSource)
.packages("com.cavion.demo.entity")
.persistenceUnit("ibdemo")
.build();
}
@Bean("ibDemoDataSourceProperties")
@Primary
@ConfigurationProperties("app.datasource.ibdemo")
public DataSourceProperties ibDemoDataSourceProperties(){
return new DataSourceProperties();
}
@Bean("ibDemoDataSource")
@Primary
@ConfigurationProperties("app.datasource.ibdemo")
public DataSource ibDemoDataSource(@Qualifier("ibDemoDataSourceProperties") DataSourceProperties ibDemoDataSourceProperties) {
return ibDemoDataSourceProperties().initializeDataSourceBuilder().build();
}
@Bean(name = "ibDemoTransactionManager")
public JpaTransactionManager transactionManager(@Qualifier("ibDemoEntityManager") EntityManagerFactory ibDemoEntityManager){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(ibDemoEntityManager);
return transactionManager;
}
}
H2DataSource
@Configuration
@EnableJpaRepositories(
entityManagerFactoryRef = "h2DemoEntityManager",
transactionManagerRef = "h2DemoTransactionManager",
basePackages = {"com.tfs.repository"}
)
public class H2DemoConfig {
@Bean(name = "h2DemoEntityManager")
public LocalContainerEntityManagerFactoryBean getServersEntityManager(EntityManagerFactoryBuilder builder,
@Qualifier("h2DemoDataSource") DataSource h2DemoDataSource){
return builder
.dataSource(h2DemoDataSource)
.packages("com.tfs.entity")
.persistenceUnit("h2demo")
.build();
}
@Bean("h2DemoDataSourceProperties")
@ConfigurationProperties("app.datasource.h2")
public DataSourceProperties h2DemoDataSourceProperties(){
return new DataSourceProperties();
}
@Bean("h2DemoDataSource")
@ConfigurationProperties("app.datasource.h2")
public DataSource h2DemoDataSource(@Qualifier("h2DemoDataSourceProperties") DataSourceProperties h2DemoDataSourceProperties) {
return h2DemoDataSourceProperties().initializeDataSourceBuilder().build();
}
@Bean(name = "h2DemoTransactionManager")
public JpaTransactionManager transactionManager(@Qualifier("h2DemoEntityManager") EntityManagerFactory h2DemoEntityManager){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(h2DemoEntityManager);
return transactionManager;
}
}
**Main method**
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class})
@EnableAsync
@EntityScan({"com.cavion.demo.entity","com.tfs.entity"})
@ComponentScan({"com.cavion.controller","com.cavion.service",
"com.udemanager.service", "com.udemanager.controller", "com.udemanager.entity" ,"com.tfs.controller","com.tfs.service"})
@Import({IBDemoConfig.class, H2DemoConfig.class})
public class UdeManagerServiceApplication extends SpringBootServletInitializer {
}
Logs Seems like H2 DataSource is still using MySql5 Dialect
2018-04-29 13:13:29.173 INFO 1888 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-04-29 13:13:29.173 INFO 1888 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
2018-04-29 13:13:57.987 INFO 1888 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'ibdemo'
2018-04-29 13:13:57.987 INFO 1888 --- [ restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [
name: ibdemo
...]
2018-04-29 13:13:58.019 INFO 1888 --- [ restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
2018-04-29 13:13:58.128 INFO 1888 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'ibdemo'
2018-04-29 13:13:58.347 INFO 1888 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'h2demo'
2018-04-29 13:13:58.347 INFO 1888 --- [ restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [
name: h2demo
...]
2018-04-29 13:13:58.394 INFO 1888 --- [ restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
2018-04-29 13:13:58.440 INFO 1888 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'h2demo'
2018-04-29 13:13:58.550 INFO 1888 --- [ restartedMain] o.h.h.i.QueryTranslatorFactoryInitiator : HHH000397: Using ASTQueryTranslatorFactory
2018-04-29 13:13:58.846 INFO 1888 --- [ restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService
解决方案
你如何创建表?使用弹簧数据源?如果您在 @SpringBootApplication 中排除 DataSourceAutoConfiguration.class,则不会发生数据库初始化。
可以查看org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration的代码。
推荐阅读
- c# - C# Linq System.Linq 和 System.Collections 之间的模糊调用
- python - IndentationError - 需要一个缩进块
- jquery - 尝试将鼠标悬停在菜单项上时下拉菜单消失
- excel - 使用 VBA 将 CSV 格式的字符串添加到 Excel 工作表
- sql - CASE** 返回 **first** 的结果
- lsmeans - 在 ANCOVA (ggplot2) 中可视化调整均值(LS 均值或估计边际均值)程序
- apache-spark - 如何使用 Spark 流式传输动态应用架构
- python - Python日期系列生成
- c# - 具有部分共享的属性、方法的类。如何避免代码重复?
- python - Python - 从视频中提取不同/独特的帧