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
标注一个默认数据源。