SpringBoot 整合Spring Data JPA多数据源

JPA和MyBatis配置多数据源类似,不同的是,JPA配置时主要提供不同的LocalContainerEntityManagerFactoryBean以及事务管理器

 

添加依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

 

application.yml配置

spring:
  datasource:
    boot:
      type: com.alibaba.druid.pool.DruidDataSource
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
      username: root
      password: 123456
    boot2:
      type: com.alibaba.druid.pool.DruidDataSource
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/boot2?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
      username: root
      password: 123456
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL57InnoDBDialect
      database: mysql
      show-sql: true

 

DataSourceConfig:

@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties("spring.datasource.boot")
    @Primary
    DataSource dsOne() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.boot2")
    DataSource dsTwo() {
        return DruidDataSourceBuilder.create().build();
    }
}

  

创建JPA配置:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.xc.xcspringboot.repository",
        entityManagerFactoryRef = "entityManagerFactoryBeanOne",
        transactionManagerRef = "platformTransactionManagerOne")
public class JpaConfigOne {

    @Resource(name = "dsOne")
    DataSource dsOne;
    @Autowired
    JpaProperties jpaProperties;

    @Bean
    @Primary
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBeanOne(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(dsOne)
                .properties(jpaProperties.getProperties())
                .packages("com.xc.xcspringboot.model")
                .persistenceUnit("pu1")
                .build();
    }

    @Bean
    PlatformTransactionManager platformTransactionManagerOne(EntityManagerFactoryBuilder builder) {
        LocalContainerEntityManagerFactoryBean factoryOne = entityManagerFactoryBeanOne(builder);
        return new JpaTransactionManager(factoryOne.getObject());
    }
}

  

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.xc.xcspringboot.repository2",
        entityManagerFactoryRef = "entityManagerFactoryBeanTwo",
        transactionManagerRef = "platformTransactionManagerTwo")
public class JpaConfigTwo {

    @Resource(name = "dsTwo")
    DataSource dsTwo;
    @Autowired
    JpaProperties jpaProperties;

    @Bean
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBeanTwo(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(dsTwo)
                .properties(jpaProperties.getProperties())
                .packages("com.xc.xcspringboot.model")
                .persistenceUnit("pu2")
                .build();
    }

    @Bean
    PlatformTransactionManager platformTransactionManagerTwo(EntityManagerFactoryBuilder builder) {
        LocalContainerEntityManagerFactoryBean factoryTwo = entityManagerFactoryBeanTwo(builder);
        return new JpaTransactionManager(factoryTwo.getObject());
    }
}

• 使用@EnableJpaRepositories注解来进行JPA的配置,该注解中主要配置三个属性:basePackages、entityManagerFactoryRef以及transactionManagerRef。其中,basePackages用来指定Repository所在的位置,entityManagerFactoryRef用来指定实体类管理工厂Bean的名称,transactionManagerRef则用来指定事务管理器的引用名称,这里的引用名称就是JpaConfigOne类中注册的Bean的名称(默认的Bean名称为方法名)。

• 创建LocalContainerEntityManagerFactoryBean,该Bean将用来提供EntityManager实例,在该类的创建过程中,首先配置数据源,然后设置JPA相关配置(JpaProperties由系统自动加载),再设置实体类所在的位置,最后配置持久化单元名,若项目中只有一个EntityManagerFactory,则persistenceUnit可以省略掉,若有多个,则必须明确指定持久化单元名。

• 由于项目中会提供两个LocalContainerEntityManagerFactoryBean实例,注解@Primary表示当存在多个LocalContainerEntityManagerFactoryBean实例时,该实例将被优先使用。

• 创建一个事务管理器。JpaTransactionManager提供对单个EntityManagerFactory的事务支持,专门用于解决JPA中的事务管理。

 

创建Repository:

public interface BookDao extends JpaRepository<Book, Integer> {

}

public interface BookDao2 extends JpaRepository<Book, Integer> {

}

  

创建Controller:

@Slf4j
@RestController
public class BookController {

    @Autowired
    BookDao bookDao;
    @Autowired
    BookDao2 bookDao2;


    @GetMapping("/test1")
    public void test1() {
        List<Book> all = bookDao.findAll();
        log.info("all " + all);
        List<Book> all2 = bookDao2.findAll();
        log.info("all2 " + all2);
    }

}

  

文章来源: Spring Boot+Vue全栈开发实战 5.4 多数据源

 

posted @ 2022-05-27 16:08  草木物语  阅读(403)  评论(0编辑  收藏  举报