Java 将Hibernate连接到两个数据库时出现问题

Java 将Hibernate连接到两个数据库时出现问题,java,spring,hibernate,connection,multiple-databases,Java,Spring,Hibernate,Connection,Multiple Databases,我的JavaSpring+Hibernate程序在使用来自两台不同服务器的两个不同数据库时遇到问题 对于不同的数据库,我有两个DAO-s和两个DAO实现文件。 实现文件如下所示: 执行情况: @Repository("erpDao") @Transactional(value="txManager2") public class ErpDaoImplementation implements ErpDao { @Autowired private final SessionFactory se

我的JavaSpring+Hibernate程序在使用来自两台不同服务器的两个不同数据库时遇到问题

对于不同的数据库,我有两个DAO-s和两个DAO实现文件。 实现文件如下所示:

执行情况:

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

我看不出我做错了什么。请帮忙!:)

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

接下来,您需要2个
HibernateTransactionManager
s,而不是一个,您不需要为每个
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;
    }
@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.
}
最后,由于
@Primary
的原因,在发生冲突的情况下,将始终使用此代码。您希望明确指定要使用哪一个

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

有什么问题?有错误消息吗?就像我说的application.properties文件中的数据库属性可以工作,但是applicationrep.properties属性不能工作。我的应用程序的第一页打开了,因为我没有使用数据库2中的任何内容。然后,当我从第一个页面登录我的应用程序时,我收到一条消息,说找不到db2中的一些表。什么意思是
不起作用了
?如果我更改第一个属性文件并插入db2的属性,那么它会找到这个表,但是找不到db1表。你能重构你的模型吗?它们有不同的包。然后将setPackagesToScan更改为重构包?你也帮了我:))