2017-02-22 112 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,即使您要使用的表格結構相同。