Hibernate使用相同的表连接到多个数据库

时间:2017-02-22 10:37:52

标签: java oracle postgresql hibernate database-migration

我必须连接到包含相同表的两个数据库(PostgreSQL,Oracle)。 当我在不同的包中创建相同表的实体时,它不起作用。

即使使用两个数据库连接,应用程序也始终只指向一个数据库连接。

Hibernate是否可以连接到不同数据库的相同表?

application.properties

public class DataSourceConfig {

    @Bean
    public DataSource getDataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/hcharts");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(getDataSource());
    }

}

配置

#DataSource settings for Postgres
datasource.secondary.url =jdbc:postgresql://localhost:5433/****
datasource.secondary.username =postgres
datasource.secondary.password =Postgre@1234
datasource.secondary.driverClassName=org.postgresql.Driver
datasource.secondary.dialect=org.hibernate.dialect.PostgreSQLDialect

#DataSource settings for oracle
datasource.primary.url = jdbc:oracle:thin:@localhost:1521:xe
datasource.primary.username = ***
datasource.primary.password = ***
datasource.primary.driverClassName=oracle.jdbc.OracleDriver

主要

@Configuration
public class MultipleDBConfig {

    @Primary
    @Bean(name = "oracleDb")
    @ConfigurationProperties(prefix = "datasource.primary")
    public DataSource mysqlDataSource() {
        return DataSourceBuilder.create().build();
    }


    @Bean(name = "postgresDb")
    @ConfigurationProperties(prefix = "datasource.secondary")
    public DataSource postgresDataSource() {
        return  DataSourceBuilder.create().build();
    }

}

@Configuration
@EnableJpaRepositories(
            entityManagerFactoryRef = "primaryEntityManager",
            transactionManagerRef = "primaryEntityManagerFactory",
            basePackages = {"com.ubl.model.*"})
public class PrimaryDBConfig {

    @Bean(name = "primaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPackagesToScan(new String[] {"com.ubl.model.migration.entity.oracle"});
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalJpaProperties());
        em.setPersistenceUnitName("customers");

        return em;
    }

    Properties additionalJpaProperties(){
        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "update");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.OracleDialect");
        properties.setProperty("hibernate.show_sql", "true");

        return properties;
    }

    @Bean
    public DataSource dataSource(){
        return DataSourceBuilder.create()
                .url("jdbc:oracle:thin:@localhost:1521:xe")
                .driverClassName("oracle.jdbc.OracleDriver")
                .username("****")
                .password("****")
                .build();
    }   

    @Bean(name = "primarytransactionManager")
    public JpaTransactionManager transactionManager(EntityManagerFactory customerEntityManager){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(customerEntityManager);

        return transactionManager;
    }

}

当我运行应用程序时,我得到以下错误: 引起:org.hibernate.tool.schema.extract.spi.SchemaExtractionException:在命名空间(,)中找到多个表

1 个答案:

答案 0 :(得分:0)

您的第二个配置似乎使用与第一个配置相同的命名空间:

basePackages = {"com.ubl.model.*"}
basePackages = {"com.ubl.*"}

一旦你的第二个配置查找它的实体,它就会发现与第一个配置相同,从而导致异常。您需要将实体和两个配置分开。

basePackages = {"com.ubl.model.datasource1"}
basePackages = {"com.ubl.model.datasource2"} // well you get the idea and will find better names ;)

然后将所有实体移动到相应的文件夹中。尽管表格“相同”,但每个表需要一个@ Entity-Class,即使您要使用的表在结构上完全相同。

相关问题