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