Spring Data JPA 配置多数据源

代码中使用 Druid 数据源,但是思想是想通的。

:本文主要讲解使用Spring Data Jpa配置应用连接多数据源。

1. 配置文件内容

配置两个数据库信息:
在配置文件中,关键部分是在配置中增加了不同的前缀,标识不同的数据源。

# -------------------------------------------------
# DEV
# 
# spring.datasource.druid.driverClassName 中间加上标识符(任意字符串)
# spring.datasource.druid.dev.driverClassName
# -------------------------------------------------
spring.datasource.druid.dev.driverClassName=oracle.jdbc.OracleDriver
spring.datasource.druid.dev.platform=oracle
spring.datasource.druid.dev.url=jdbc:oracle:thin:@192.168.56.10:1521:orcl
spring.datasource.druid.dev.username=TEST
spring.datasource.druid.dev.password=TEST

# -------------------------------------------------
# U8
# -------------------------------------------------
spring.datasource.druid.u8.driverClassName=oracle.jdbc.OracleDriver
spring.datasource.druid.u8.platform=oracle
spring.datasource.druid.u8.url=jdbc:oracle:thin:@192.168.56.40:1521:orcl
spring.datasource.druid.u8.username=TEST
spring.datasource.druid.u8.password=TEST

2. 配置类

要点在于:基础的数据源只有一个,在其中要使用@Primary注解;对于其他的数据源,不可使用@Primary注解,其他的配置大同小异。

2.1 基础数据源(主数据源)

/**
 * DEV 环境数据源
 * 
 * 作为基础数据源,所以在方法上有 @Primary 注解
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
		// 实体管理器工厂Bean,要对应代码中的bean名称
        entityManagerFactoryRef = "entityManagerFactoryDev",
        // 事务管理器Bean,要对应代码中的bean名称
        transactionManagerRef = "transactionManagerDev",
        // 指定数据库对应的Repository类在哪个包下
        basePackages = {"me.zhen.multidb.dev.*.repository"}
)
public class DataSourceDevConfig {

    @Autowired
    private HibernateProperties hibernateProperties;

    @Resource
    private JpaProperties jpaProperties;

	/**
	 * 创建 DataSource bean
	 * 注意:注解 @Primary
	 */
    @Primary
    @Bean(name = "dataSourceDev")
    @ConfigurationProperties(prefix = "spring.datasource.druid.dev")
    public DataSource dataSourceDev(){
        return DruidDataSourceBuilder.create().build();
    }

	/**
 	 * 创建实体管理器工厂Bean
 	 */
    @Primary
    @Bean(name = "entityManagerFactoryDev")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryDev(EntityManagerFactoryBuilder builder){
        Map<String, Object> properties = hibernateProperties.determineHibernateProperties(
                jpaProperties.getProperties(), new HibernateSettings());

        return builder
                .dataSource(dataSourceDev())
                // 对应的实体类的目录
                .packages("me.zhen.multidb.dev.*.entity")
                .persistenceUnit("devPersistenceUnit")
                .properties(properties)
                .build();
    }

	/**
	 * 创建对应的实体管理器Bean
	 */
    @Primary
    @Bean(name = "entityManagerDev")
    public EntityManager entityManagerDev(EntityManagerFactoryBuilder builder){
        return entityManagerFactoryDev(builder).getObject().createEntityManager();
    }

	/**
	 * 创建事务管理器Bean
	 */
    @Primary
    @Bean(name = "transactionManagerDev")
    public PlatformTransactionManager transactionManagerDev(EntityManagerFactoryBuilder builder){
        return new JpaTransactionManager(entityManagerFactoryDev(builder).getObject());
    }
}
2.2 其他数据源(从数据源)

/**
 * U8 环境数据源
 * 
 * 最大不同在于:不使用 @Primary 注解
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactoryU8",
        transactionManagerRef = "transactionManagerU8",
        basePackages = {"me.zhen.multidb.u8.*.repository"}
)
public class DataSourceU8Config {

    @Resource
    private HibernateProperties hibernateProperties;

    @Resource
    private JpaProperties jpaProperties;

    @Bean(name = "dataSourceU8")
    @ConfigurationProperties(prefix = "spring.datasource.druid.u8")
    public DataSource dataSourceU8(){
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "entityManagerFactoryU8")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryU8(EntityManagerFactoryBuilder builder){
        Map<String, Object> properties = hibernateProperties.determineHibernateProperties(
                jpaProperties.getProperties(), new HibernateSettings());

        return builder
                .dataSource(dataSourceU8())
                // 实体类的目录
                .packages("me.zhen.multidb.u8.*.entity")
                .persistenceUnit("u8PersistenceUnit")
                .properties(properties)
                .build();
    }

    @Bean(name = "entityManagerU8")
    public EntityManager entityManagerU8(EntityManagerFactoryBuilder builder){
        return entityManagerFactoryU8(builder).getObject().createEntityManager();
    }

    @Bean(name = "transactionManagerU8")
    public PlatformTransactionManager transactionManagerU8(EntityManagerFactoryBuilder builder){
        return new JpaTransactionManager(entityManagerFactoryU8(builder).getObject());
    }

}

如果再有其他数据源需要连接,只需要在配置文件中,再添加一个数据源信息,然后拷贝上面的从数据源(对应上面的DataSourceU8Config),修改里面的一下配置即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值