1

I have problem, when I try use 2 databases I get errors

My error log:

NoUniqueBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: reportDataSource,secondDataSource

Then if I set @Primary on first datasource I get error on second database query:

o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 942, SQLState: 42000 o.h.engine.jdbc.spi.SqlExceptionHelper : ORA-00942: table or view does not exist

org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet

SQL work if I run it manualy on DB.

Hibernete don't see my table for not @Primary datasource. When I remove first database from app second works fine. In my opinion both Entity Mangers use @Primary datasource, that's why Hibernate don't see table from second.

I don't have idea what I should do now. Any help will be welcomed.

First DbConfig:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "reportEntityMangerFactory", 
        basePackages = {"com.company.db.report.repository"}
)
public class ReportDbConfig {
    
    @Bean(name = "reportDataSource")
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        dataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:FIRST");
        dataSource.setUsername("test");
        dataSource.setPassword("test");

        return dataSource;
    }
    
    @Bean(name = "reportEntityManager")
    public EntityManager entityManager() {
        return entityManagerFactory().createEntityManager();
    }
    
    @Bean(name = "reportEntityMangerFactory")
    public EntityManagerFactory entityManagerFactory() {
        HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", "validate");
        properties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
        HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
        
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setDataSource(dataSource());
        factory.setJpaVendorAdapter(jpaVendorAdapter);
        factory.setPackagesToScan("com.company.db.report.entity");
        factory.setJpaPropertyMap(properties);
        factory.afterPropertiesSet();
        return factory.getObject();
    }
}

Second DBConfig:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "secondEntityMangerFactory",
        basePackages = {"com.company.db.second.repository"}
)
public class SecondDbConfig {

    @Bean(name = "secondDataSource")
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        dataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:SECOND");
        dataSource.setUsername("test");
        dataSource.setPassword("test");

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

    @Bean(name = "secondEntityMangerFactory")
    public EntityManagerFactory entityManagerFactory() {
        HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", "validate");
        properties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
        HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
        
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setDataSource(dataSource());
        factory.setJpaVendorAdapter(jpaVendorAdapter);
        factory.setPackagesToScan("com.company.db.second.entity");
        factory.setJpaPropertyMap(properties);
        factory.afterPropertiesSet();
        return factory.getObject();
    }
}

Repository from 1st DB (com.company.db.report.repository.DbUserRepository):

@Repository
@Table(name = "DB_USER")
public interface DbUserRepository extends JpaRepository<DbUser, Long> {
    
    List<DbUser> findAll();
    
    DbUser save(DbUser entity);
}

Repository from 2nd DB (com.company.db.second.repository.BvpRepository):

@Repository
@Table(name = "BVP")
public interface BvpRepository extends JpaRepository<Bvp, Long> {
    
    List<Bvp> findAll();
    
    Bvp save(Bvp entity);
}

Entity for 1st DB are in com.company.db.report.entity, for 2nd DB in com.company.db.second.entity.

Similar problem was there, but that answer doesn't help.

Community
  • 1
  • 1
Son
  • 960
  • 2
  • 14
  • 25

1 Answers1

0

If you need to check the configuration take a look this link in order to refactor and make your code more readable.

I can see that you are using @Table in the repository. @Table must be used in entities which represent a table in your database. In your case, would be at Bvp and DbUser classes.

Eddú Meléndez
  • 6,107
  • 1
  • 26
  • 35