将Hibernate连接到两个数据库的问题

时间:2015-05-21 07:28:29

标签: java spring hibernate connection multiple-databases

我遇到了让我的Java Spring + Hibernate程序与来自两个不同服务器的两个不同数据库一起工作的问题。

我有两个DAO-s和两个不同数据库的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();
}
}

我有两个选项文件,包含两个数据库的数据。来自第一个选项文件的任何数据库都可以使用,但其他数据库不可用。

这也是我的hibernate配置文件:

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

我无法看到我做错了什么。请帮忙! :)

1 个答案:

答案 0 :(得分:1)

您的配置和设置存在多种方面的缺陷。首先,你在字段和构造函数上都有@Autowired,它们互相干扰。由于@Primary和这些注释基本上只使用了一个SessionFactory。要解决从@Autowired字段中删除SessionFactory的问题。

接下来,您需要2个HibernateTransactionManager而不是单个{y},每个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.
}
相关问题