使用JPA和spring数据源实例连接到其他数据源 [英] Connect to different Datasource using JPA with spring datasource instance

查看:245
本文介绍了使用JPA和spring数据源实例连接到其他数据源的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个用例,其中我必须与两个不同的Mysql数据库进行通信.

I have a use-case in which I have to communicate with two different Mysql databases.

使用MysqlTemplate,我可以使用以下代码成功实现我的用例

Using MysqlTemplate I am successfully able to implement my use-case using below code

 @Configuration
    public class MySqlConfiguration {
        @Primary
        @Bean(name = "dbA")
        @ConfigurationProperties("spring.url-a")
        public DataSource dbA() {
            return DataSourceBuilder.create().build();
        }

        @Bean
        @Primary
        @Qualifier("jdbcDbA")
        public JdbcTemplate dbATemplate(@Qualifier("dbA") DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }

        @Bean(name = "dbB")
        @ConfigurationProperties(prefix = "spring.url-b")
        public DataSource dbB() {
            return DataSourceBuilder.create().build();
        }

        @Bean
        @Qualifier("jdbcdbB")
        public JdbcTemplate dbBTemplate(@Qualifier("dbB") DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
    }

上面的代码初始化JdbcTemplate模板的两个不同实例(每个用于数据源).

This above code initializes two different instances of JdbcTemplate template (one each for a data source).

我现在想做的是:

如果我们想使用JPA连接到两个不同的数据源(Mysql), 根据spring-official github代码,我们可以做到.

If we want to connect to two different data sources(Mysql) using JPA, according to spring-official github code, we can do it.

但是我们可以使用以上两个不同的jdbcTemplate与使用JPA repository的不同MySQL数据库进行通信吗?

But can we use above two different jdbcTemplate for communicating with different MySQL databases using JPA repository?

我相信内部JPA也在使用数据库的实例(jdbcTemplate).

What I believe is that internally JPA is also using an instance of the database(jdbcTemplate).

那么是否有可能以某种方式将数据库实例传递给JPA repository并与其他数据库通信?

So is it possible to somehow pass an instance of the database to JPA repository and communicate with different databases?

推荐答案

好,现在有新答案我已经正确阅读了问题.您将需要2个事务管理器,每个数据库一个.

Ok, new answer now I have read the question correctly. You will need 2 transaction managers, one for each data base.

您上面的配置应如下所示:

Your Config above should be something like this:

@Configuration
public class JpaConfig {

    @Bean
    public DataSource dataSource1() {
        return DataSourceBuilder
                .create()
                .username("")
                .password("")
                .url("")
                .driverClassName("")
                .build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManager1(DataSource dataSource1) {
        LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactory.setDataSource(dataSource1);
        entityManagerFactory.setPackagesToScan("entities for dataSource 1");
        return entityManagerFactory;
    }

    @Bean(name = "transactionManager1")
    public JpaTransactionManager transactionManager1(EntityManagerFactory entityManager1) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManager1);
        return transactionManager;
    }

    @Bean
    public DataSource dataSource2() {
        return DataSourceBuilder
                .create()
                .username("")
                .password("")
                .url("")
                .driverClassName("")
                .build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManager2(DataSource dataSource2) {
        LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactory.setDataSource(dataSource2);
        entityManagerFactory.setPackagesToScan("entities for dataSource 2");
        return entityManagerFactory;
    }

    @Bean(name = "transactionManager2")
    public JpaTransactionManager transactionManager2(EntityManagerFactory entityManager2) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManager2);
        return transactionManager;
    }
}

然后在您的服务或DAO中,您可以决定要使用哪个数据库

Then in your service, or DAO you can decide which database to use

@Service
@Transactional(transactionManager = "transactionManager1")
public class Service {

这篇关于使用JPA和spring数据源实例连接到其他数据源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆