Spring boot + jpa 配置多数据源

这篇博客详细介绍了如何在Spring Boot应用中配置多个数据源,并分别配置EntityManagerFactory和TransactionManager。通过@Configuration和@Bean注解,作者创建了两个数据源,分别为'mainDataSource'和'otherDataSource',并分别配置了各自的事务管理器。此外,还展示了如何指定实体类和Repository的位置,确保每个数据源都能正确处理相应的数据库操作。

配置文件

# mian DB properties:
main.datasource.jdbcUrl=jdbc:mysql://localhost:3306/emipe?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
main.datasource.username=root
main.datasource.password=root
main.datasource.driverClassName=com.mysql.cj.jdbc.Driver
# other DB config
other.datasource.jdbcUrl=jdbc:mysql://192.168.20.77:3306/gaea_dev?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
other.datasource.username=root
other.datasource.password=1qaz369*
other.datasource.driverClassName=com.mysql.cj.jdbc.Driver

配置数据源dataSource

@Configuration
public class DataSourceConfig {
    // 注意,这里需要有一个@Primary注解,
    // 告诉框架有两个实现类的时候优先选择这个实现类,
    // 如果不使用会报错“required a bean of type 'org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties' that could not be found.”
    @Primary
    // @Bean后面的括号的内容可有可无,因为我这里的写法很规范,方法名就是mainDataSource
    // 如果不一样需要@Bean加上声明的变量名称
    @Bean("mainDataSource")
    @ConfigurationProperties(prefix = "main.datasource")
    public DataSource mainDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean("otherDataSource")
    @ConfigurationProperties(prefix = "other.datasource")
    public DataSource otherDataSource() {
        return DataSourceBuilder.create().build();
    }
}

配置EntityManagerFactory和TransactionManager

第一个数据源的配置

/**
 * @author caicai
 * @create 2021/6/4
 */
@Configuration
// 启用事务管理注解
@EnableTransactionManagement
// 启用JPA仓库注解,
// 其中第一个属性对应Bean名称为”mainEntityManagerFactory“的对象,声明了该数据源所使用的对象管理类工厂
// 第二个属性声明事务管理器,对应名称为”mainTransactionManager“的JavaBean
// 第三个属性表示dao层所在的包
@EnableJpaRepositories(entityManagerFactoryRef = "mainEntityManagerFactory", transactionManagerRef = "mainTransactionManager",
        basePackages = {"com.caicai.emipe.persistence.main"})
public class MainDataSourceConfig {

    @Autowired
    @Qualifier("mainDataSource")
    private DataSource mainDataSource;

    @Autowired(required = false)
    private JpaProperties jpaProperties;


    @Autowired
    private HibernateProperties hibernateProperties;

    // 配置EntityManagerFactory,因为一共有两个数据源,
    // 其中一个在配置EntityManagerFactory时需要加@Primary注解
    @Primary
    @Bean(name = "mainEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean mainEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(mainDataSource)
                //设置entity所在位置
                .packages("com.caicai.emipe.persistence.main")
                .persistenceUnit("mainPersistenceUnit")
                .properties(getVendorProperties())
                .build();
    }

    private Map<String, Object> getVendorProperties() {
        return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
    }

    // 配置事务管理器,也需要添加@Primary注解
    @Primary
    @Bean(name = "mainTransactionManager")
    public PlatformTransactionManager mainTransactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(mainEntityManagerFactory(builder).getObject());
    }
}

第二个数据源的配置


/**
 * @author caicai
 * @create 2021/6/4
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "otherEntityManagerFactory", transactionManagerRef = "otherTransactionManager",
        basePackages = {"com.caicai.emipe.persistence.other"})
public class OtherDataSourceConfig {

    @Autowired
    @Qualifier("otherDataSource")
    private DataSource otherDataSource;

    @Autowired
    private JpaProperties jpaProperties;

    @Autowired
    private HibernateProperties hibernateProperties;

    @Bean(name = "otherEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean otherEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(otherDataSource)
                .packages("com.caicai.emipe.persistence.other")
                .persistenceUnit("otherPersistenceUnit")
                .properties(getVendorProperties())
                .build();
    }

    private Map<String, Object> getVendorProperties() {
        return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
    }

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

}

Entity和Repository

根据之前的配置位置写入实体类和Repository,这个就跟平常使用Jpa一样,对应的表名不要写串了

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值