2015-05-21 6 views
1

У меня возникли проблемы с работой моей программы Java Spring + Hibernate с двумя разными базами данных с двух разных серверов.Проблемы с подключением Hibernate к двум базам данных

У меня есть два файла DAO и два файла реализации DAO для разных баз данных. файлы реализации выглядит следующим образом:

ErpDaoImplementation:

@Repository("erpDao") 
@Transactional(value="txManager2") 
public class ErpDaoImplementation implements ErpDao { 

@Autowired 
private final SessionFactory sessionFactory2; 

@Autowired 
public ErpDaoImplementation(@Qualifier(value="sessionFactory2") final SessionFactory sessionFactory2) { 
    this.sessionFactory2 = sessionFactory2; 
} 

public Session getSession() { 
    return sessionFactory2.getCurrentSession(); 
} 

@Override 
public ArrayList<ErpOrder> getOrder() { 
    Criteria criteria = getSession().createCriteria(ErpOrder.class); 
    return (ArrayList<ErpOrder>) criteria.list(); 
    } 
} 

PortalDaoImplementation:

@Repository("portalDao") 
@Transactional(value="txManager1") 
public class PortalDaoImplementation implements PortalDao { 

@Autowired 
private final SessionFactory sessionFactory1; 

@Autowired 
public PortalDaoImplementation(@Qualifier(value="sessionFactory1") final SessionFactory sessionFactory1) { 
    this.sessionFactory1 = sessionFactory1; 
} 

public Session getSession() { 
    return sessionFactory1.getCurrentSession(); 
} 

@Override 
public void saveEmployee(NewEmployeeBasic newEmployeeBasic) { 
    getSession().save(newEmployeeBasic); 
} 

@SuppressWarnings("unchecked") 
@Override 
public ArrayList<BasicInfo> findAllEmployees() { 
    Criteria criteria = getSession().createCriteria(BasicInfo.class).addOrder(Order.asc("name")); 
    return (ArrayList<BasicInfo>) criteria.list(); 
} 
} 

И у меня есть две опции файлы, имеющие данные о обеих базах данных. Любая база данных из первого файла опций будет работать, а другая нет.

Кроме того, это мой спящий configutarion файл:

@Configuration 
@EnableTransactionManagement 
@ComponentScan({"com.alti.hrportal.configuration"}) 
public class HibernateConfiguration { 

private static final PropertiesLoader propertiesLoader1 = new PropertiesLoader(); 
Properties propHrPortal = propertiesLoader1.load("application.properties"); 

private static final PropertiesLoader propertiesLoader2 = new PropertiesLoader(); 
Properties propErp = propertiesLoader2.load("applicationErp.properties"); 


@Bean 
public LocalSessionFactoryBean sessionFactory1() { 
    LocalSessionFactoryBean sessionFactory1 = new LocalSessionFactoryBean(); 
    sessionFactory1.setDataSource(dataSource1()); 
    sessionFactory1.setPackagesToScan(new String[]{"com.alti.hrportal.model"}); 
    sessionFactory1.setHibernateProperties(hibernateProperties1()); 
    return sessionFactory1; 
} 

@Bean 
@Primary 
public LocalSessionFactoryBean sessionFactory2() { 
    LocalSessionFactoryBean sessionFactory2 = new LocalSessionFactoryBean(); 
    sessionFactory2.setDataSource(dataSource2()); 
    sessionFactory2.setPackagesToScan(new String[]{"com.alti.hrportal.model"}); 
    sessionFactory2.setHibernateProperties(hibernateProperties2()); 
    return sessionFactory2; 
} 

@Bean 
public DataSource dataSource1() { 
    DriverManagerDataSource dataSource1 = new DriverManagerDataSource(); 
    dataSource1.setDriverClassName(propHrPortal.getProperty("jdbc.driverClassName")); 
    dataSource1.setUrl(propHrPortal.getProperty("jdbc.url")); 
    dataSource1.setUsername(propHrPortal.getProperty("jdbc.username")); 
    dataSource1.setPassword(propHrPortal.getProperty("jdbc.password")); 
    return dataSource1; 
} 

@Bean 
public DataSource dataSource2() { 
    DriverManagerDataSource dataSource2 = new DriverManagerDataSource(); 
    dataSource2.setDriverClassName(propErp.getProperty("jdbc.driverClassName")); 
    dataSource2.setUrl(propErp.getProperty("jdbc.url")); 
    dataSource2.setUsername(propErp.getProperty("jdbc.username")); 
    dataSource2.setPassword(propErp.getProperty("jdbc.password")); 
    return dataSource2; 
} 


private Properties hibernateProperties1() { 
    Properties properties1 = new Properties(); 
    properties1.put("hibernate.dialect", propHrPortal.getProperty("hibernate.dialect")); 
    properties1.put("hibernate.show_sql", propHrPortal.getProperty("hibernate.show_sql")); 
    properties1.put("hibernate.format_sql", propHrPortal.getProperty("hibernate.format_sql")); 
    return properties1; 
} 

private Properties hibernateProperties2() { 
    Properties properties2 = new Properties(); 
    properties2.put("hibernate.dialect", propErp.getProperty("hibernate.dialect")); 
    properties2.put("hibernate.show_sql", propErp.getProperty("hibernate.show_sql")); 
    properties2.put("hibernate.format_sql", propErp.getProperty("hibernate.format_sql")); 
    return properties2; 
} 

@Bean 
@Autowired 
@Qualifier(value = "txManager1") 
public HibernateTransactionManager transactionManager1(SessionFactory s) { 
    HibernateTransactionManager txManager1 = new HibernateTransactionManager(); 
    txManager1.setSessionFactory(s); 
    return txManager1; 
} 

@Bean 
@Autowired 
@Qualifier(value = "txManager2") 
public HibernateTransactionManager transactionManager2(SessionFactory s) { 
    HibernateTransactionManager txManager2 = new HibernateTransactionManager(); 
    txManager2.setSessionFactory(s); 
    return txManager2; 
} 
} 

Я не могу видеть, что я делаю неправильно. Пожалуйста помоги! :)

+0

В чем проблема? Любое сообщение об ошибке? – Jens

+0

Как я уже сказал, свойства базы данных из файла application.properties будут работать, но свойства applicationErp.properties не будут работать. Первая страница моего приложения открывается, потому что я ничего не использую из базы данных 2. И затем, когда я регистрирую свое приложение с первой страницы, я получил сообщение о том, что некоторая таблица из db2 не найдена. –

+0

Что означает 'не сработает'? – Jens

ответ

1

Ваша конфигурация и настройка ошибочны несколькими способами. Сначала у вас есть как @Autowired на полях и конструкторах, они мешают друг другу. Из-за @Primary и эти аннотации в основном используется только один SessionFactory. Чтобы исправить удаление @Autowired с полей SessionFactory.

Далее вам нужно 2 HibernateTransactionManager s вместо одного, yuo нужно по одному для каждого SessionFactory, и вам нужно указать в своем аннотации @Transactional, какой из них использовать.

@Repository("erpDao") 
@Transactional(value="txManager2") 
public class ErpDaoImplementation implements ErpDao { 

    private final SessionFactory sessionFactory2; 

    @Autowired 
    public ErpDaoImplementation(@Qualifier(value="sessionFactory2") final SessionFactory sessionFactory2) { 
     this.sessionFactory2 = sessionFactory2; 
    } 

Наконец граждения @Primary в случае конфликта это один всегда будет использоваться один. Вы хотите явно указать, какой из них использовать.

@Configuration 
@EnableTransactionManagement 
@ComponentScan({"com.alti.hrportal.configuration"}) 
public class HibernateConfiguration { 

    private static final PropertiesLoader propertiesLoader1 = new PropertiesLoader(); 
    Properties propHrPortal = propertiesLoader1.load("application.properties"); 

    private static final PropertiesLoader propertiesLoader2 = new PropertiesLoader(); 
    Properties propErp = propertiesLoader2.load("applicationErp.properties"); 

    @Bean 
    public LocalSessionFactoryBean sessionFactory2() { 
     LocalSessionFactoryBean sessionFactory2 = new LocalSessionFactoryBean(); 
     sessionFactory2.setDataSource(dataSource2()); 
     sessionFactory2.setPackagesToScan(new String[]{"com.alti.hrportal.model"}); 
     sessionFactory2.setHibernateProperties(hibernateProperties2()); 
     return sessionFactory2; 
    } 


    @Bean(name="txManager1") 
    public HibernateTransactionManager transactionManager1() { 
     HibernateTransactionManager txManager1 = new HibernateTransactionManager(); 
     txManager1.setSessionFactory(sessionFactory1().getObject()); 
     return txManager1;   
    } 

    @Bean(name="txManager2") 
    public HibernateTransactionManager transactionManager2() { 
     HibernateTransactionManager txManager2 = new HibernateTransactionManager(); 
     txManager2.setSessionFactory(sessionFactory2().getObject()); 
     return txManager2; 
    } 
    // Omitted other not modified configuration. 
} 
+0

tnx все работает отлично! –

+0

Ты мне тоже помог :)) –