Hibernate 支持多数据源配置。要实现多数据源配置,关键在于为每个数据源创建独立的 SessionFactory 实例。Hibernate 本身不限制你只使用一个数据库连接配置,而是允许你为多个数据库分别配置和管理连接。

实现步骤如下(以 Spring + Hibernate 为例):

1. 配置多个数据源(DataSource

你需要为每个数据库单独配置一个数据源,比如:

@Bean(name = "dataSource1")
@ConfigurationProperties(prefix = "spring.datasource.db1")
public DataSource dataSource1() {
    return DataSourceBuilder.create().build();
}

@Bean(name = "dataSource2")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource dataSource2() {
    return DataSourceBuilder.create().build();
}

2. 配置多个 LocalSessionFactoryBean

每个数据源都要有一个对应的 SessionFactory

@Bean(name = "sessionFactory1")
public LocalSessionFactoryBean sessionFactory1(@Qualifier("dataSource1") DataSource dataSource) {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(dataSource);
    sessionFactory.setPackagesToScan("com.example.db1.entities");
    sessionFactory.setHibernateProperties(hibernateProperties());
    return sessionFactory;
}

@Bean(name = "sessionFactory2")
public LocalSessionFactoryBean sessionFactory2(@Qualifier("dataSource2") DataSource dataSource) {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(dataSource);
    sessionFactory.setPackagesToScan("com.example.db2.entities");
    sessionFactory.setHibernateProperties(hibernateProperties());
    return sessionFactory;
}

3. 配置多个 TransactionManager

@Bean(name = "transactionManager1")
public HibernateTransactionManager transactionManager1(
        @Qualifier("sessionFactory1") SessionFactory sessionFactory) {
    return new HibernateTransactionManager(sessionFactory);
}

@Bean(name = "transactionManager2")
public HibernateTransactionManager transactionManager2(
        @Qualifier("sessionFactory2") SessionFactory sessionFactory) {
    return new HibernateTransactionManager(sessionFactory);
}

4. 使用时在 DAO 或 Service 中注入对应的 SessionFactory

@Autowired
@Qualifier("sessionFactory1")
private SessionFactory sessionFactory1;

@Autowired
@Qualifier("sessionFactory2")
private SessionFactory sessionFactory2;

注意事项

  • 不同的实体类建议按包分隔,分别用于不同数据库。
  • 事务管理器也要分别对应,使用 @Transactional(transactionManager = "xxx") 指定。
  • Spring Boot 中也可用 @Primary 标注一个默认数据源。