2017-02-22 3 views
1

Ich muss eine Verbindung zu zwei Datenbanken (PostgreSQL, Oracle), die die gleichen Tabellen enthält. Wenn ich Entitäten der gleichen Tabellen in verschiedenen Paketen erstellen, funktioniert es nicht.Hibernate Verbindung mit mehreren Datenbanken mit gleichen Tabellen

Auch wenn zwei Datenbankverbindungen verwendet werden, zeigt die Anwendung immer nur auf eine Datenbankverbindung.

Ist es in Hibernate möglich, mit denselben Tabellen aus verschiedenen Datenbanken zu verbinden?

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 

Konfiguration

@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(); 
    } 

} 

Primärer

@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; 
    } 

} 

Secondary

@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()); 
    } 


} 

Wenn ich ausführen, um die Anwendung, die ich unter Fehlern: Verursacht durch: org.hibernate.tool.schema.extract.spi.SchemaExtractionException: Mehr als eine Tabelle im Namensraum gefunden (,)

Antwort

0

Ihre zweite Konfiguration erscheint als den gleichen Namensraum zu verwenden, zuerst:

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

Sobald die zweite Konfiguration sucht es Entitäten sind, es ist das gleiche wie die Faust entdeckt hat und damit in dem ex resultierenden Aufnahme. Sie werden Ihre Entitäten und Ihre Konfigurationen trennen wollen.

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

Dann verschieben Sie alle Ihre Entitäten in den entsprechenden Ordner. Obwohl die Tabelle "identisch" ist, benötigen Sie eine @ Entity-Klasse für jede einzelne Tabelle, auch wenn die Tabellen, die Sie verwenden möchten, strukturell identisch sind.

Verwandte Themen