2016-11-02 2 views
0

Я извлекаю данные из двух разных баз данных, используя MyBatis 3.3.1 и Spring 4.3. Два класса конфигурации для сканирования картостроители посмотреть на следующее:MyBatis + Spring MapperScan с Mulitple Источники данных

@Configuration 
    @MapperScan(value="com.mapper1.map", 
    SqlSessionFactoryRef="sqlSessionFactory1") 
    public class AppConfig { 
    @Bean 
    public DataSource getDataSource1() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
     dataSource.setUrl("jdbc:mysql://localhost:3306/database1"); 
     dataSource.setUsername("user"); 
     dataSource.setPassword("pw"); 
     return dataSource; 
    } 
    @Bean 
    public DataSourceTransactionManager transactionManager1() { 
     return new DataSourceTransactionManager(getDataSource1()); 
    } 
    @Bean 
    public SqlSessionFactory sqlSessionFactory1() throws Exception { 
     SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 
     sessionFactory.setDataSource(getDataSource1()); 
     return sessionFactory.getObject(); 
    } 
} 

    @Configuration 
    @MapperScan(value="com.mapper2.map", 
    SqlSessionFactoryRef="sqlSessionFactory2") 
    public class AppConfig { 
    @Bean 
    public DataSource getDataSource2() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
     dataSource.setUrl("jdbc:mysql://localhost:3307/database2"); 
     dataSource.setUsername("user"); 
     dataSource.setPassword("pw"); 
     return dataSource; 
    } 
    @Bean 
    public DataSourceTransactionManager transactionManager2() { 
     return new DataSourceTransactionManager(getDataSource2()); 
    } 
    @Bean 
    public SqlSessionFactory sqlSessionFactory2() throws Exception { 
     SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 
     sessionFactory.setDataSource(getDataSource2()); 
     return sessionFactory.getObject(); 
    } 
} 

Код развертывает прекрасно, но только картографы из источника данных 1 работ. Когда я пытаюсь использовать mapper из источника данных 2, я получаю исключение «Нет таблицы найдено» из моей базы данных. Проблема в том, что, хотя я устанавливаю конкретный SqlSessionFactory, который я хочу использовать в mapperScan, он заканчивает использование другого SqlSessionFactory для всех картографов. Если я закомментирую SqlSessionFactory в конфигурации 1, то конфигурация 2 будет работать.

Обратите внимание, что если я не использую MapperScan, но вместо этого использую компонент MapperScannerConfigurer, я могу правильно извлекать данные.

У кого-нибудь еще были проблемы с использованием @MapperScan с несколькими источниками данных?

ответ

0

Единственная проблема, которую я вижу в вашем коде, - SqlSessionFactoryRef, должна быть из нижнего регистра: (sqlSessionFactory). Кроме того, все в порядке, этот подход работает для меня.

Вы также можете посмотреть ace-mybatis. Он позволяет работать с несколькими источниками данных, настраивая только один компонент.

Смежные вопросы