spring boot jpa 多数据源配置

在实际项目中往往会使用2个数据源,这个时候就需要做额外的配置了。下面的配置在2.0.1.RELEASE 测试通过

1、配置文件

  配置两个数据源

spring.datasource.url=jdbc:mysql://localhost:13306/first?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.seconddatasource.url=jdbc:mysql://localhost:3306/second?useUnicode\=true&characterEncoding=utf-8&useSSL=falsespring.seconddatasource.driverClassName=com.mysql.jdbc.Driver
spring.seconddatasource.username=root
spring.seconddatasource.password=

  

2、entity

  创建两个简单的entity,它们分别对应不同的数据库。

  先看第一个entity,user

package com.example.first.entity;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private String email;
    private int age;
}

  第二个entity, product

package com.example.second.entity;

@Entity
public class Product {

    @Id
    private Long id;
    private String name;
    private double price;
}

  注意:这两个enty位于不同的包里面。

3、Repository

  创建两个对应的Repository,注意他们也位于不同的包里

  

package com.example.first.dao;

public interface UserRepository
  extends JpaRepository<User, Long> { }

  

package com.example.second.dao;

public interface ProductRepository
  extends JpaRepository<Product, Long> { }

  

4、java 配置

  有两个数据源,需要两个配置文件,分别配置下面这几个Bean

  DataSource

  EntityManagerFactory

  TransactionManager

  首先配置第一个数据源,我把它作为主数据源,注意,它们都使用了@Prime注解

@Configuration
@EnableJpaRepositories(basePackages = "com.example.first.dao",
        entityManagerFactoryRef = "firstEntityManager",
        transactionManagerRef = "firstTransactionManager")
public class FirstDataSourceConfig {

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean firstEntityManager(EntityManagerFactoryBuilder builder) {

        Map<String, String> properties = new HashMap<>();
        properties.put("hibernate.implicit_naming_strategy",
                "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
        properties.put("hibernate.physical_naming_strategy",
                "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
        return builder
                .dataSource(firstDataSource())
                .packages("com.example.user.entity")
                .persistenceUnit("first")
                .properties(properties)
                .build();
    }

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource")
    public DataSourceProperties firstDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource")
    public DataSource firstDataSource() {
        return primaryDataSourceProperties().initializeDataSourceBuilder().build();
    }

    @Primary
    @Bean(name = "firstTransactionManager")
    public PlatformTransactionManager firstTransactionManager(@Qualifier("firstEntityManager")
                                                                      EntityManagerFactory firstEntityManagerFactory) {
        return new JpaTransactionManager(firstEntityManagerFactory);
    }
}

  

  接下来配置第二个数据源,和第一个完全一致,除了没有@Prime注解

@Configuration
@EnableJpaRepositories(
        basePackages = "com.example.second.dao",
        entityManagerFactoryRef = "secondEntityManager",
        transactionManagerRef = "secondTransactionManager"
)
public class SecondDataSourceConfig {

    @Bean
    public LocalContainerEntityManagerFactoryBean secondEntityManager(EntityManagerFactoryBuilder builder) {
        Map<String, String> properties = new HashMap<>();
        properties.put("hibernate.implicit_naming_strategy",
                "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
        properties.put("hibernate.physical_naming_strategy",
                "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
        return builder
                .dataSource(secondDataSource())
                .packages("com.example.second.entity")
                .persistenceUnit("second")
                .properties(properties)
                .build();
    }

    @Bean
    @ConfigurationProperties("spring.seconddatasource")
    public DataSourceProperties secondDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("spring.seconddatasource")
    public DataSource secondDataSource() {
        return secondDataSourceProperties().initializeDataSourceBuilder().build();
    }

    @Bean(name = "secondTransactionManager")
    public PlatformTransactionManager secondTransactionManager(@Qualifier("secondEntityManager")
                                                                      EntityManagerFactory secondEntityManagerFactory) {
        return new JpaTransactionManager(secondEntityManagerFactory);
    }
}

  

5、使用

  和单数据源的jpa使用方式基本一致。当使用事务注解是,第一个数据源的注解可以直接使用@Transactional,第二个为了区分必须使用@Transactional(value="secondTransactionManager")。可以在一个事务中调用另外一个数据源的事务。

2.0.1.RELEASE

原文地址:https://www.cnblogs.com/lilinwei340/p/9657922.html

时间: 2024-10-02 20:54:37

spring boot jpa 多数据源配置的相关文章

Spring Boot Jpa多数据源配置

前言随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,如:user一个库,business一个库.那么接下来我们就要考虑怎么去在spring boot中实现多个数据源的配置. ××× 实现建表首先是建表语句,我们要建立两个数据库,并各库内新建一张表user表mysql> use user:mysql> select * from user;+----+-------+----------+| id | name | password |+----+----

Spring Boot Jpa 的使用

使用 Spring Boot Jpa 开发时,发现国内对 Spring Boot Jpa 全面介绍的文章比较少案例也比较零碎,因此写文章总结一下Spring Data JPA 参考指南! Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据.它的出现主要是为了简化现有的持久化开发工作和整合 ORM

jpa多数据源配置参考链接

jpa单数据源配置: http://doc.okbase.net/liuyitian/archive/109276.html jpa多数据源配置: http://www.blogjava.net/weir/archive/2015/01/08/422132.html jpa不在persistence.xml文件中配置每个Entity实体类的2中解决办法 http://www.cnblogs.com/taven/archive/2013/10/04/3351841.html spring+jpa两

Spring Boot JPA 连接数据库

本文将介绍如何在Spring Boot 工程中添加JPA作为持久化方式. 修改 pom.xml 依赖 与上一篇介绍的 jdbc 不同的是 spring-boot-starter-jdbc 修改为 spring-boot-starter-data-jpa 即可,当然数据库驱动包也是不可少的,如下: <!-- MYSQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-conne

spring boot项目自定义数据源,mybatisplus分页、逻辑删除无效解决方法

Spring Boot项目中数据源的配置可以通过两种方式实现: 1.application.yml或者application.properties配置 2.注入DataSource及SqlSessionFactory两个Bean 通过第二种方式配置数据源则按照MybatisPlus官方文档使用分页及逻辑删除插件会无效,解决思路是在初始化SqlSessionFactory将插件设置进去 /** * 逻辑删除插件 */ @Bean public GlobalConfig globalConfig()

[转] Druid简介(Spring Boot + Mybatis + Druid数据源【自己定制】)

Druid的简介Druid是一个非常优秀的数据库连接池.在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBoss DataSource. Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验. Druid是一个JDBC组件,它包括三个部分: 基于Filter-Chain模式的插件体系. DruidDataSource 高效可管理的数据库连接池. SQLParser Druid的功能兼容DBCPDruid提

Spring Boot 探索系列 - 自动化配置篇

26. Logging Prev  Part IV. Spring Boot features  Next 26. Logging Spring Boot uses Commons Logging for all internal logging, but leaves the underlying log implementation open. Default configurations are provided for Java Util Logging,Log4J, Log4J2 an

学记:为spring boot写一个自动配置

spring boot遵循"约定由于配置"的原则,使用annotation对一些常规的配置项做默认配置,减少或不使用xml配置,让你的项目快速运行起来.spring boot的神奇不是借助代码的生成来实现的,而是通过条件注解来实现的. 自动配置AutoConfiguration是实现spring boot的重要原理,理解AutoConfiguration的运行原理特别重要,自己写一个AutoConfiguration可以加深我们对spring boot的理解. 1.定义Type-saf

自建生成代码工具(暂支持Spring boot +JPA)(更新中)

我们努力的方向就是用更少的时间写出更高质量的代码,因此我们都需要借助一些工具来提高自己的开发效率.写代码有些年头了,慢慢的可以写一些东西来提高工作效率.主要会从Java后台和Android开始,暂时叫“Auto coding”,大家如果有更好的想法麻烦告诉我,谢谢. 1. 生成后台和管理端代码  往往我们做项目会先把表建好再进行编码,管理端有多相似的地方,所以通过表SQL利用AutoCoding所以大部分代码,再对部分部分地方手动调整就能先快速完成一个功能模块. Spring boot JPA