Spring Boot整合Jpa多数据源

本文是Spring Boot整合数据持久化方案的最后一篇,主要和大伙来聊聊Spring Boot整合Jpa多数据源问题。在Spring Boot整合JbdcTemplate多数据源、Spring Boot整合MyBatis多数据源以及Spring Boot整合Jpa多数据源这三个知识点中,整合Jpa多数据源算是最复杂的一种,也是很多人在配置时最容易出错的一种。

工程创建

首先是创建一个Spring Boot工程,创建时添加基本的Web、Jpa以及MySQL依赖,如下:

创建完成后,添加Druid依赖,这里和前文的要求一样,要使用专为Spring Boot打造的Druid,大伙可能发现了,如果整合多数据源一定要使用这个依赖,因为这个依赖中才有DruidDataSourceBuilder。完整依赖如下:

      <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</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>

如此之后,工程就创建成功了。

基本配置

在基本配置中,我们首先来配置多数据源基本信息以及DataSource,首先在application.properties中添加如下配置信息:

spring.datasource.one.url=jdbc:mysql:///ssm?serverTimezone=UTC
spring.datasource.one.username=xiaoliu
spring.datasource.one.password=960614abcd
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.two.url=jdbc:mysql:///xiaoliu?serverTimezone=UTC
spring.datasource.two.username=xiaoliu
spring.datasource.two.password=960614abcd
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSourcespring.jpa.properties.hibernate.ddl-auto=update
spring.jpa.properties.database-platform=mysql
spring.jpa.properties.database=mysql
spring.jpa.properties.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

这里Jpa的配置和上文相比key中多了properties,多数据源的配置和前文一致,然后接下来配置两个DataSource,如下:

@Configuration
public class DataSourceConfig {@Bean@Primary@ConfigurationProperties(prefix = "spring.datasource.one")DataSource dsOne(){return DruidDataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix = "spring.datasource.two")DataSource dsTwo(){return DruidDataSourceBuilder.create().build();}
}

这里的配置和前文的多数据源配置基本一致,但是注意多了一个在Spring中使用较少的注解@Primary,这个注解一定不能少,否则在项目启动时会出错,@Primary表示当某一个类存在多个实例时,优先使用哪个实例。

好了,这样,DataSource就有了。

多数据源配置

接下来配置Jpa的基本信息,这里两个数据源,我分别在两个类中来配置,先来看第一个配置:

@Configuration
@EnableJpaRepositories(basePackages = "cn.itxiaoliu.dao1",entityManagerFactoryRef ="localContainerEntityManagerFactoryBean1",
transactionManagerRef = "platformTransactionManager1")
public class JpaConfig1 {@Autowired@Qualifier("dsOne")DataSource dsOne;/****/@AutowiredJpaProperties jpaProperties;@Bean@PrimaryLocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean1(EntityManagerFactoryBuilder builder){return builder.dataSource(dsOne).properties(jpaProperties.getProperties()).persistenceUnit("pu1").packages("cn.itxiaoliu.bean").build();}@BeanPlatformTransactionManager platformTransactionManager1(EntityManagerFactoryBuilder builder){return new JpaTransactionManager(localContainerEntityManagerFactoryBean1(builder).getObject());}
}

首先这里注入dsOne,再注入JpaProperties,JpaProperties是系统提供的一个实例,里边的数据就是我们在application.properties中配置的jpa相关的配置。然后我们提供两个Bean,分别是LocalContainerEntityManagerFactoryBean和PlatformTransactionManager事务管理器,不同于MyBatis和JdbcTemplate,在Jpa中,事务一定要配置。在提供LocalContainerEntityManagerFactoryBean的时候,需要指定packages,这里的packages指定的包就是这个数据源对应的实体类所在的位置,另外在这里配置类上通过@EnableJpaRepositories注解指定dao所在的位置,以及LocalContainerEntityManagerFactoryBean和PlatformTransactionManager分别对应的引用的名字。

好了,这样第一个就配置好了,第二个基本和这个类似,主要有几个不同点:

  • dao的位置不同
  • persistenceUnit不同
  • 相关bean的名称不同

注意实体类可以共用。

代码如下:

@Configuration
@EnableJpaRepositories(basePackages = "cn.itxiaoliu.dao2",entityManagerFactoryRef ="localContainerEntityManagerFactoryBean2",
transactionManagerRef = "platformTransactionManager2")
public class JpaConfig2 {@Autowired@Qualifier("dsTwo")DataSource dsTwo;/****/@AutowiredJpaProperties jpaProperties;@BeanLocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean2(EntityManagerFactoryBuilder builder){return builder.dataSource(dsTwo).properties(jpaProperties.getProperties()).persistenceUnit("pu2").packages("cn.itxiaoliu.bean").build();}@BeanPlatformTransactionManager platformTransactionManager2(EntityManagerFactoryBuilder builder){return new JpaTransactionManager(localContainerEntityManagerFactoryBean2(builder).getObject());}
}

接下来,在对应位置分别提供相关的实体类和dao即可,数据源一的dao如下:

public interface BookDao1 extends JpaRepository<Book,Integer> {}

数据源二的dao如下:

public interface BookDao2 extends JpaRepository<Book,Integer> {}

共同的实体类如下:

@Entity(name = "t_book")
public class Book {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String name;private String author;@Overridepublic String toString() {return "Book{" +"id=" + id +", name='" + name + '\'' +", author='" + author + '\'' +'}';}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}
}

到此,所有的配置就算完成了,接下来就可以在Service中注入不同的UserDao,不同的UserDao操作不同的数据源。

其实整合Jpa多数据源也不算难,就是有几个细节问题,这些细节问题解决,其实前面介绍的其他多数据源整个都差不多。

接下来在测试类中进行测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class Jpa2ApplicationTests {@AutowiredBookDao1 bookDao1;@AutowiredBookDao2 bookDao2;@Testpublic void contextLoads() {List<Book> all = bookDao1.findAll();System.out.println(all);List<Book> all1 = bookDao2.findAll();System.out.println(all1);}}

Spring Boot整合Jpa多数据源相关推荐

  1. spring boot 系列之四:spring boot 整合JPA

    上一篇我们讲了spring boot 整合JdbcTemplate来进行数据的持久化, 这篇我们来说下怎么通过spring boot 整合JPA来实现数据的持久化. 一.代码实现 修改pom,引入依赖 ...

  2. Spring Boot基础学习笔记07:Spring Boot整合JPA

    文章目录 零.学习目标 1.熟悉Spring Data JPA基本语法和使用 2.掌握Spring Boot与JPA的整合使用 一.Spring Data JPA概述 1.Spring Data JP ...

  3. Spring boot整合jpa Jquery实现三级联动

    Spring boot 整合jpa JQuery 实现省,市,区, 三级联动效果 三级联动在很多项目都必不可少,尤其是在付款时,需要选取地址,为了更好的用户体验感,从而出现了三级联动. 实现三级联动的 ...

  4. Spring Boot整合JPA和人大金仓(Kingbase8)数据库

    Spring Boot整合JPA和人大金仓(Kingbase8)数据库 简介 在开发Java应用程序时,使用JPA(Java Persistence API)可以方便地进行数据库操作.而人大金仓(Ki ...

  5. spring boot 整合 jpa

    1.在pom.xml中添加mysql 和 jpa 依赖 <dependency><groupId>org.springframework.boot</groupId> ...

  6. Spring boot 整合Jpa 配置文件参数

    #数据库驱动 spring.datasource.driverClassName = com.mysql.jdbc.Driver #数据库连接地址 spring.datasource.url = jd ...

  7. spring boot整合JPA实现多条件查询并分页

    1.在DAO中的实现代码: public Page<User> findAdminUserPage(PageRequest pr, String name) {String sql = & ...

  8. springboot整合hibernate_峰哥说技术系列-17 .Spring Boot 整合 Spring Data JPA

    今日份主题 Spring Boot 整合 Spring Data JPA JPA(Java Persistence API)是用于对象持久化的 API,是Java EE 5.0 平台标准的 ORM 规 ...

  9. Spring Boot 整合 Spring Data JPA

    JPA 是一个基于 O/R 映射的 Java 持久化规范,其定义了一系列对象持久化的标准,目前实现这一规范的产品有 Hibernate.EclipseLink.OpenJPA.TopLink 等,这也 ...

最新文章

  1. 解密美国五角大楼人工智能中心
  2. 实现首字母或拼音检索-sql语句方式
  3. AJPFX关于collection总结
  4. 使用 IntelliJ IDEA 查看类图,内容极度舒适
  5. MongoDB在linux下的启动
  6. html导出pdf实例,jsPDF导出pdf示例
  7. wuauclt.exe是什么进程?
  8. 几种支持动作模型格式的比较(MD2,MD5,sea3d) 【转】
  9. Go语言中的面向对象
  10. 成都互联网公司和生活成本
  11. (转载)基于STM32的多节锂电池管理系统的设计
  12. 想转行学IT,小白如何选择靠谱的培训学校
  13. idea验证失败_解决iPad登陆不了Apple ID验证失败的问题
  14. ffmpeg库编译加文字_我自己的FFMpeg编译之路
  15. 华为路由器基础知识和命令
  16. 「数据运营」理解DataOps运营
  17. Linux常用命令cp详解
  18. matlab绘制风场图(矢量图、箭头图)
  19. 2.1.数列极限——实数系
  20. Wordpress 网站设计入门5 级联菜单设计

热门文章

  1. 微信小程序学习记录——4.框架-视图层
  2. iOS调用百度地图 V2.3.0
  3. ehvierwer登录与不登录_【更新】亿寻—免登录不限速下载百度网盘
  4. 微信公众号 测试号 申请
  5. 文档习惯之格式篇 用文档逼疯一个人的五种办法
  6. 外贸邮箱服务器设置,外贸邮客户端设置方法?
  7. foo python_foo_grabber_python.dll
  8. linux防火墙关了连不上,SecrueCRT连接linux需要关闭linux防火墙_Centos 6.4 iptables防火墙关闭启动详解...
  9. 我的世界服务器启动显示非正常,大佬们,HMCL启动提示非正常退出,请帮我看看怎么回事。...
  10. 12306车站信息爬取(4)——添加车票的票价信息