2017-02-22 133 views
1

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

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

Hibernate有可能连接到来自不同数据库的相同表吗?

application.properties

#DataSource settings for Postgres 
datasource.secondary.url =jdbc:postgresql://localhost:5433/**** 
datasource.secondary.username =postgres 
datasource.secondary.password [email protected] 
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; 
    } 

} 

二次

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(
     entityManagerFactoryRef = "secondaryEntityManagerFactory", 
     transactionManagerRef = "secondaryTransactionManager", 
     basePackages = {"com.ubl.*"}) 
public class SecondaryDBConfig { 

    @Autowired 
    JpaVendorAdapter jpaVendorAdapter; 

    @Value("${datasource.secondary.url}") 
    private String databaseURL; 

    @Value("${datasource.secondary.username}") 
    private String username; 

    @Value("${datasource.secondary.password}") 
    private String password; 

    @Value("${datasource.secondary.driverClassName}") 
    private String driverClassName; 

    @Value("${datasource.secondary.dialect}") 
    private String dialect; 

    public SecondaryDBConfig() { 
     System.out.println("Secondary repository"); 
     System.out.println("driverClassName: *************" +driverClassName); 
    } 

    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(databaseURL, username, password); 
     dataSource.setDriverClassName(driverClassName); 
     return dataSource; 
    } 

    @Bean(name = "secondaryEntityManager") 
    public EntityManager entityManager() { 
     return entityManagerFactory().createEntityManager(); 
    } 

    @Bean(name = "secondaryEntityManagerFactory") 
    public EntityManagerFactory entityManagerFactory() { 
     Properties properties = new Properties(); 
     properties.setProperty("hibernate.dialect", dialect); 

     LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); 
     emf.setDataSource(dataSource()); 
     emf.setJpaVendorAdapter(jpaVendorAdapter); 
     emf.setPackagesToScan("com.ubl.model.*"); // package for entities 
     emf.setPersistenceUnitName("secondaryPersistenceUnit"); 
     emf.setJpaProperties(properties); 
     emf.afterPropertiesSet(); 
     return emf.getObject(); 
    } 

    @Bean(name = "secondaryTransactionManager") 
    public PlatformTransactionManager transactionManager() { 
     return new JpaTransactionManager(entityManagerFactory()); 
    } 


} 

当我跑我得到以下错误的应用程序: 产生的原因:org.hibernate.tool.schema.extract.spi.SchemaExtractionException:在命名空间中找到多个表(,)

回答

0

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

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

一旦你的第二个配置寻找它的实体,它发现一样的拳头做,从而导致前ception。你会想分开你的实体和你的配置。

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

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