Spring Data Jpa配置多数据源的方法

要在项目中为Spring Data JPA配置超过一个数据源,就需要创建多个Data Source Bean和对应的EntityManagerFactory.以下是创建步骤。

第1步 配置DataSource

application.yaml里添加:

spring:
  datasource:
    first:
      url: jdbc:mysql://localhost:3306/first-db
      username:
      password:
      driver-class-name: om.mysql.cj.jdbc.Driver
    second:
      url: jdbc:mysql://localhost:3306/second-db
      username:
      password:
      driver-class-name: om.mysql.cj.jdbc.Driver

第2步 创建多个Data Source Bean

在配置中创建多个Data SourceBean, 并使用@ConfigurationProperties注解来绑定各个数据源的配置属性。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;

@Configuration
public class DataSourceConfigurer {

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

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

第3步 配置EntityManagerFactory

创建多个EntityManagerFactory bean,每个EntityManagerFactory与一个DataSource关联,并指定persistenceUnitName以便在后续的JPA配置中使用。

import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;

@Configuration
public class JpaConfig {

    @Bean
    public LocalContainerEntityManagerFactoryBean firstEntityManagerFactory(
            JpaVendorAdapter jpaVendorAdapter, DataSource firstDataSource) {
        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setDataSource(firstDataSource);
        emf.setPackagesToScan("com.example.first.entity");
        emf.setJpaVendorAdapter(jpaVendorAdapter);
        emf.setPersistenceUnitName("firstEntityManager");
        return emf;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory(
            JpaVendorAdapter jpaVendorAdapter, DataSource secondDataSource) {
        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setDataSource(secondDataSource);
        emf.setPackagesToScan("com.example.second.entity");
        emf.setJpaVendorAdapter(jpaVendorAdapter);
        emf.setPersistenceUnitName("secondEntityManager");
        return emf;
    }

    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        return new HibernateJpaVendorAdapter();
    }
}

第4步 为每个数据源自定义Repository

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface FirstEntityRepository extends JpaRepository<FirstEntity, Long> {
}

@Repository
public interface SecondEntityRepository extends JpaRepository<SecondEntity, Long> {
}

继承对应的Repository就可以实现不同数据源的查询了。

发表回复

您的电子邮箱地址不会被公开。