Spring 和具有多个数据库的 Hibernate

Spring and Hibernate with multiple databases

晚上好, 处理两个或多个数据库的正确和常用方法是什么?

考虑这个 HibernateConfiguration class 只配置一个数据源:

@Configuration @EnableTransactionManagement
@PropertySource(value = { "classpath:hibernate.properties" })
public class HibernateConfiguration {

    @Autowired 
    private Environment env;

    @Bean 
    public DataSource getDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        // ... setting data source
        return dataSource;
    }

    private Properties getHibernateProperties() {
        Properties properties = new Properties();
        // ... setting Hibernate properties
        return properties;
    }

    @Bean 
    public LocalSessionFactoryBean getSessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(getDataSource());
        sessionFactory.setPackagesToScan(new String[] { "POJOs'" });
        sessionFactory.setHibernateProperties(getHibernateProperties());
        return sessionFactory;
    }

    @Bean public HibernateTransactionManager transactionManager(SessionFactory sf) {
        HibernateTransactionManager htm = new HibernateTransactionManager();
        htm.setSessionFactory(sf);
        return htm;
    }
}

建议让一个class配置一个数据源?还是一次配置就足够了?我如何在 Dao 中指定将使用哪个 SessionFactory 以及在两个不同的托管服务器上切换两个完全相同的数据库时推荐的方法是什么?

示例 DAO。首先,我需要在 FooBar 之间切换。

@Repository
public class RepositoryImpl implements RepositoryDao {

@Autowired // Here I need to switch between databases "foo" and "bar"
private SessionFactory sessionFactory;

...

第二个我需要固定在示例数据库上 Foo

@Repository
public class FooImpl implements FooDao {

@Autowired // Here I need fixed on "Foo"
private SessionFactory sessionFactory;

一种方法

    @Bean
    @Primary
    @ConfigurationProperties("app.datasource.foo")
    public DataSourceProperties fooDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @ConfigurationProperties("app.datasource.foo")
    public DataSource fooDataSource() {
        return fooDataSourceProperties().initializeDataSourceBuilder().build();
    }

    @Bean
    @ConfigurationProperties("app.datasource.bar")
    public BasicDataSource barDataSource() {
        return (BasicDataSource) DataSourceBuilder.create()
                .type(BasicDataSource.class).build();
    }

Spring multiple datasources config

其他方法可能是:从 persistence.xml 加载不同的映射 (orm.xml) 或在实体 类.

中引用不同的模式