• 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 多数据源

  • 相关阅读:
    75. InputStreamReader和OutputStreamWriter(转换流--字节流转换成字符流)
    74. 编码与解码
    73. PrintStream(打印流)
    72.Properties(配置文件)
    71 Serializable(序列化和反序列化)
    70. SequenceInputStream(文件合并)
    Rabin-Karp指纹字符串查找算法
    优先队列
    版本管理工具svn简介
    php 2038年问题
  • 原文地址:https://www.cnblogs.com/ooo0/p/16318028.html
Copyright © 2020-2023  润新知