首页 > 解决方案 > 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

标签: springspring-bootspring-dataspring-data-jpa

解决方案


你如何创建表?使用弹簧数据源?如果您在 @SpringBootApplication 中排除 DataSourceAutoConfiguration.class,则不会发生数据库初始化。

可以查看org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration的代码。


推荐阅读