簡體   English   中英

hibernate5 + spring 開機連接多個數據庫

[英]hibernate5 + spring boot connect multiple databases

我想用hibernate連接兩個不同的數據庫,使用不同的sessionfactory操作數據

在下面的示例中,@Configuration class 中將添加另一個數據源和 LocalSessionFactoryBean,但是如何為這兩個 sessionFactory 指定具體名稱?

參考:

https://www.baeldung.com/hibernate-5-spring


@Configuration
@EnableTransactionManagement
public class HibernateConf {

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(
          {"com.baeldung.hibernate.bootstrap.model" });
        sessionFactory.setHibernateProperties(hibernateProperties());

        return sessionFactory;
    }

    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1");
        dataSource.setUsername("sa");
        dataSource.setPassword("sa");

        return dataSource;
    }

    @Bean
    public PlatformTransactionManager hibernateTransactionManager() {
        HibernateTransactionManager transactionManager
          = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        return transactionManager;
    }

    private final Properties hibernateProperties() {
        Properties hibernateProperties = new Properties();
        hibernateProperties.setProperty(
          "hibernate.hbm2ddl.auto", "create-drop");
        hibernateProperties.setProperty(
          "hibernate.dialect", "org.hibernate.dialect.H2Dialect");

        return hibernateProperties;
    }
}

想要達到的效果:

@Service
@Transactional
public class TestRepositoryImpl implements TestRepository{

    @Qualifier("connectionA")
    @Autowired
    private SessionFactory sessionFactory;

    @Qualifier("connectionB")
    @Autowired
    private SessionFactory sessionFactory;
...
...
}

另一個項目示例:

@Configuration
public class DataSourceConfig {

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

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

    @Primary
    @Autowired
    @Bean(name = "test1Connection")
    public NamedParameterJdbcTemplate test1JdbcTemplate(@Qualifier("test1DataSource") DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }

    @Autowired
    @Bean(name ="test2Connection")
    public NamedParameterJdbcTemplate test2JdbcTemplate(@Qualifier("test2DataSource") DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }
}

任何幫助是極大的贊賞!

如果你想用兩個數據庫實現 hibernate:使用如下所示的 session 工廠。

但我建議使用 Spring 數據 JPA 它會給出更多規范並且更容易理解。

 public class Transfer {
    public static void main(String[] args) {
        // get the SessionFacotry
        SessionFactory connectionAFactory = HibernateConf.getSessionFactory();
        SessionFactory connectionBFactory= DataSourceConfig.getSessionFactory();
        // get The Session
        Session connectionASes = HibernateConf.getSession();
        Session connectionBSes = DataSourceConfig.getSession();
       

為此,您可以像這樣配置數據連接 bean:

@Configuration
public class DataSourceConfig {

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

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

    @Primary
    @Autowired
    @Bean(name = "test1Connection")
    public NamedParameterJdbcTemplate test1JdbcTemplate(@Qualifier("test1DataSource") DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }

    @Autowired
    @Bean(name ="test2Connection")
    public NamedParameterJdbcTemplate test2JdbcTemplate(@Qualifier("test2DataSource") DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }
}

之后,您可以在服務 class 中使用 @Qualifier 以下列方式分別自動裝配它們:

@Service
@Transactional
public class TestRepositoryImpl implements TestRepository{

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

    @Qualifier("test2Connection")
    @Autowired
    private SessionFactory sessionFactory2;
...
...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM