Skip to content

Latest commit

History

History

demo-multi-datasource-jpa

Folders and files

NameName
Last commit message
Last commit date

parent directory

..

spring-boot-demo-multi-datasource-jpa

Này demo chủ yếu biểu thị Spring Boot như thế nào tổng thể JPA nhiều số liệu nguyên.

pom.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http:// w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<artifactId>spring-boot-demo-multi-datasource-jpa</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>spring-boot-demo-multi-datasource-jpa</name>
<description>Demo project for Spring Boot</description>

<parent>
<groupId>com.xkcoding</groupId>
<artifactId>spring-boot-demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

<build>
<finalName>spring-boot-demo-multi-datasource-jpa</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

PrimaryDataSourceConfig.java

Chủ số liệu nguyên phối trí

/**
* <p>
* JPA nhiều số liệu nguyên phối trí - chủ số liệu nguyên
* </p>
*
* @author yangkai.shen
* @date Created in 2019-01-17 15:58
*/
@Configuration
publicclassPrimaryDataSourceConfig{

/**
* rà quét spring.datasource.primary mở đầu phối trí tin tức
*
* @return số liệu nguyên phối trí tin tức
*/
@Primary
@Bean(name="primaryDataSourceProperties")
@ConfigurationProperties(prefix="spring.datasource.primary")
publicDataSourcePropertiesdataSourceProperties() {
returnnewDataSourceProperties();
}

/**
* thu hoạch chủ kho số liệu nguyên đối tượng
*
* @param dataSourceProperties rót vào tên là primaryDataSourceProperties bean
* @return số liệu nguyên đối tượng
*/
@Primary
@Bean(name="primaryDataSource")
publicDataSourcedataSource(@Qualifier("primaryDataSourceProperties")DataSourcePropertiesdataSourceProperties) {
returndataSourceProperties.initializeDataSourceBuilder().build();
}

/**
* nên phương pháp chỉ ở yêu cầu sử dụng JdbcTemplate đối tượng khi tuyển dụng
*
* @param dataSource rót vào tên là primaryDataSource bean
* @return số liệu nguyên JdbcTemplate đối tượng
*/
@Primary
@Bean(name="primaryJdbcTemplate")
publicJdbcTemplatejdbcTemplate(@Qualifier("primaryDataSource")DataSourcedataSource) {
returnnewJdbcTemplate(dataSource);
}

}

SecondDataSourceConfig.java

Từ số liệu nguyên phối trí

/**
* <p>
* JPA nhiều số liệu nguyên phối trí - số lần theo nguyên
* </p>
*
* @author yangkai.shen
* @date Created in 2019-01-17 15:58
*/
@Configuration
publicclassSecondDataSourceConfig{

/**
* rà quét spring.datasource.second mở đầu phối trí tin tức
*
* @return số liệu nguyên phối trí tin tức
*/
@Bean(name="secondDataSourceProperties")
@ConfigurationProperties(prefix="spring.datasource.second")
publicDataSourcePropertiesdataSourceProperties() {
returnnewDataSourceProperties();
}

/**
* thu hoạch chủ kho số liệu nguyên đối tượng
*
* @param dataSourceProperties rót vào tên là secondDataSourceProperties bean
* @return số liệu nguyên đối tượng
*/
@Bean(name="secondDataSource")
publicDataSourcedataSource(@Qualifier("secondDataSourceProperties")DataSourcePropertiesdataSourceProperties) {
returndataSourceProperties.initializeDataSourceBuilder().build();
}

/**
* nên phương pháp chỉ ở yêu cầu sử dụng JdbcTemplate đối tượng khi tuyển dụng
*
* @param dataSource rót vào tên là secondDataSource bean
* @return số liệu nguyên JdbcTemplate đối tượng
*/
@Bean(name="secondJdbcTemplate")
publicJdbcTemplatejdbcTemplate(@Qualifier("secondDataSource")DataSourcedataSource) {
returnnewJdbcTemplate(dataSource);
}

}

PrimaryJpaConfig.java

Chủ JPA phối trí

/**
* <p>
* JPA nhiều số liệu nguyên phối trí - chủ JPA phối trí
* </p>
*
* @author yangkai.shen
* @date Created in 2019-01-17 16:54
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
// repository bao danh
basePackages=PrimaryJpaConfig.REPOSITORY_PACKAGE,
// thật thể quản lý bean tên
entityManagerFactoryRef="primaryEntityManagerFactory",
// sự vụ quản lý bean tên
transactionManagerRef="primaryTransactionManager")
publicclassPrimaryJpaConfig{
staticfinalStringREPOSITORY_PACKAGE="com.xkcoding.multi.datasource.jpa.repository.primary";
privatestaticfinalStringENTITY_PACKAGE="com.xkcoding.multi.datasource.jpa.entity.primary";


/**
* rà quét spring.jpa.primary mở đầu phối trí tin tức
*
* @return jpa phối trí tin tức
*/
@Primary
@Bean(name="primaryJpaProperties")
@ConfigurationProperties(prefix="spring.jpa.primary")
publicJpaPropertiesjpaProperties() {
returnnewJpaProperties();
}

/**
* thu hoạch chủ kho thật thể quản lý nhà xưởng đối tượng
*
* @param primaryDataSource rót vào tên là primaryDataSource số liệu nguyên
* @param jpaProperties rót vào tên là primaryJpaProperties jpa phối trí tin tức
* @param builder rót vào EntityManagerFactoryBuilder
* @return thật thể quản lý nhà xưởng đối tượng
*/
@Primary
@Bean(name="primaryEntityManagerFactory")
publicLocalContainerEntityManagerFactoryBeanentityManagerFactory(@Qualifier("primaryDataSource")DataSourceprimaryDataSource,@Qualifier("primaryJpaProperties")JpaPropertiesjpaProperties,EntityManagerFactoryBuilderbuilder) {
returnbuilder
// thiết trí số liệu nguyên
.dataSource(primaryDataSource)
// thiết trí jpa phối trí
.properties(jpaProperties.getProperties())
// thiết trí thật thể bao danh
.packages(ENTITY_PACKAGE)
// thiết trí kéo dài hóa đơn nguyên danh, dùng cho @PersistenceContext chú giải thu hoạch EntityManager khi chỉ định số liệu nguyên
.persistenceUnit("primaryPersistenceUnit").build();
}

/**
* thu hoạch thật thể quản lý đối tượng
*
* @param factory rót vào tên là primaryEntityManagerFactory bean
* @return thật thể quản lý đối tượng
*/
@Primary
@Bean(name="primaryEntityManager")
publicEntityManagerentityManager(@Qualifier("primaryEntityManagerFactory")EntityManagerFactoryfactory) {
returnfactory.createEntityManager();
}

/**
* thu hoạch chủ kho sự vụ quản lý đối tượng
*
* @param factory rót vào tên là primaryEntityManagerFactory bean
* @return sự vụ quản lý đối tượng
*/
@Primary
@Bean(name="primaryTransactionManager")
publicPlatformTransactionManagertransactionManager(@Qualifier("primaryEntityManagerFactory")EntityManagerFactoryfactory) {
returnnewJpaTransactionManager(factory);
}

}

SecondJpaConfig.java

Từ JPA phối trí

/**
* <p>
* JPA nhiều số liệu nguyên phối trí - thứ JPA phối trí
* </p>
*
* @author yangkai.shen
* @date Created in 2019-01-17 16:54
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
// repository bao danh
basePackages=SecondJpaConfig.REPOSITORY_PACKAGE,
// thật thể quản lý bean tên
entityManagerFactoryRef="secondEntityManagerFactory",
// sự vụ quản lý bean tên
transactionManagerRef="secondTransactionManager")
publicclassSecondJpaConfig{
staticfinalStringREPOSITORY_PACKAGE="com.xkcoding.multi.datasource.jpa.repository.second";
privatestaticfinalStringENTITY_PACKAGE="com.xkcoding.multi.datasource.jpa.entity.second";


/**
* rà quét spring.jpa.second mở đầu phối trí tin tức
*
* @return jpa phối trí tin tức
*/
@Bean(name="secondJpaProperties")
@ConfigurationProperties(prefix="spring.jpa.second")
publicJpaPropertiesjpaProperties() {
returnnewJpaProperties();
}

/**
* thu hoạch chủ kho thật thể quản lý nhà xưởng đối tượng
*
* @param secondDataSource rót vào tên là secondDataSource số liệu nguyên
* @param jpaProperties rót vào tên là secondJpaProperties jpa phối trí tin tức
* @param builder rót vào EntityManagerFactoryBuilder
* @return thật thể quản lý nhà xưởng đối tượng
*/
@Bean(name="secondEntityManagerFactory")
publicLocalContainerEntityManagerFactoryBeanentityManagerFactory(@Qualifier("secondDataSource")DataSourcesecondDataSource,@Qualifier("secondJpaProperties")JpaPropertiesjpaProperties,EntityManagerFactoryBuilderbuilder) {
returnbuilder
// thiết trí số liệu nguyên
.dataSource(secondDataSource)
// thiết trí jpa phối trí
.properties(jpaProperties.getProperties())
// thiết trí thật thể bao danh
.packages(ENTITY_PACKAGE)
// thiết trí kéo dài hóa đơn nguyên danh, dùng cho @PersistenceContext chú giải thu hoạch EntityManager khi chỉ định số liệu nguyên
.persistenceUnit("secondPersistenceUnit").build();
}

/**
* thu hoạch thật thể quản lý đối tượng
*
* @param factory rót vào tên là secondEntityManagerFactory bean
* @return thật thể quản lý đối tượng
*/
@Bean(name="secondEntityManager")
publicEntityManagerentityManager(@Qualifier("secondEntityManagerFactory")EntityManagerFactoryfactory) {
returnfactory.createEntityManager();
}

/**
* thu hoạch chủ kho sự vụ quản lý đối tượng
*
* @param factory rót vào tên là secondEntityManagerFactory bean
* @return sự vụ quản lý đối tượng
*/
@Bean(name="secondTransactionManager")
publicPlatformTransactionManagertransactionManager(@Qualifier("secondEntityManagerFactory")EntityManagerFactoryfactory) {
returnnewJpaTransactionManager(factory);
}

}

application.yml

spring:
datasource:
primary:
url:jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8
username:root
password:root
driver-class-name:com.mysql.cj.jdbc.Driver
type:com.zaxxer.hikari.HikariDataSource
hikari:
minimum-idle:5
connection-test-query:SELECT 1 FROM DUAL
maximum-pool-size:20
auto-commit:true
idle-timeout:30000
pool-name:PrimaryHikariCP
max-lifetime:60000
connection-timeout:30000
second:
url:jdbc:mysql://127.0.0.1:3306/spring-boot-demo-2?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8
username:root
password:root
driver-class-name:com.mysql.cj.jdbc.Driver
type:com.zaxxer.hikari.HikariDataSource
hikari:
minimum-idle:5
connection-test-query:SELECT 1 FROM DUAL
maximum-pool-size:20
auto-commit:true
idle-timeout:30000
pool-name:SecondHikariCP
max-lifetime:60000
connection-timeout:30000
jpa:
primary:
show-sql:true
generate-ddl:true
hibernate:
ddl-auto:update
properties:
hibernate:
dialect:org.hibernate.dialect.MySQL57InnoDBDialect
open-in-view:true
second:
show-sql:true
generate-ddl:true
hibernate:
ddl-auto:update
properties:
hibernate:
dialect:org.hibernate.dialect.MySQL57InnoDBDialect
open-in-view:true
logging:
level:
com.xkcoding:debug
org.hibernate.SQL:debug
org.hibernate.type:trace

SpringBootDemoMultiDatasourceJpaApplicationTests.java

packagecom.xkcoding.multi.datasource.jpa;

importcn.hutool.core.bean.BeanUtil;
importcn.hutool.core.lang.Snowflake;
importcom.xkcoding.multi.datasource.jpa.entity.primary.PrimaryMultiTable;
importcom.xkcoding.multi.datasource.jpa.entity.second.SecondMultiTable;
importcom.xkcoding.multi.datasource.jpa.repository.primary.PrimaryMultiTableRepository;
importcom.xkcoding.multi.datasource.jpa.repository.second.SecondMultiTableRepository;
importlombok.extern.slf4j.Slf4j;
importorg.junit.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.test.context.junit4.SpringRunner;

importjava.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
publicclassSpringBootDemoMultiDatasourceJpaApplicationTests{
@Autowired
privatePrimaryMultiTableRepositoryprimaryRepo;
@Autowired
privateSecondMultiTableRepositorysecondRepo;
@Autowired
privateSnowflakesnowflake;

@Test
publicvoidtestInsert() {
PrimaryMultiTableprimary=newPrimaryMultiTable(snowflake.nextId(),"Thí nghiệm tên -1");
primaryRepo.save(primary);

SecondMultiTablesecond=newSecondMultiTable();
BeanUtil.copyProperties(primary,second);
secondRepo.save(second);
}

@Test
publicvoidtestUpdate() {
primaryRepo.findAll().forEach(primary-> {
primary.setName("Sửa chữa sau"+primary.getName());
primaryRepo.save(primary);

SecondMultiTablesecond=newSecondMultiTable();
BeanUtil.copyProperties(primary,second);
secondRepo.save(second);
});
}

@Test
publicvoidtestDelete() {
primaryRepo.deleteAll();

secondRepo.deleteAll();
}

@Test
publicvoidtestSelect() {
List<PrimaryMultiTable>primary=primaryRepo.findAll();
log.info("【primary】= {}",primary);

List<SecondMultiTable>second=secondRepo.findAll();
log.info("【second】= {}",second);
}

}

Mục lục kết cấu

.
├── README.md
├── pom.xml
├── spring-boot-demo-multi-datasource-jpa.iml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com.xkcoding.multi.datasource.jpa
│ │ │ ├── SpringBootDemoMultiDatasourceJpaApplication.java
│ │ │ ├── config
│ │ │ │ ├── PrimaryDataSourceConfig.java
│ │ │ │ ├── PrimaryJpaConfig.java
│ │ │ │ ├── SecondDataSourceConfig.java
│ │ │ │ ├── SecondJpaConfig.java
│ │ │ │ └── SnowflakeConfig.java
│ │ │ ├── entity
│ │ │ │ ├── primary
│ │ │ │ │ └── PrimaryMultiTable.java
│ │ │ │ └── second
│ │ │ │ └── SecondMultiTable.java
│ │ │ └── repository
│ │ │ ├── primary
│ │ │ │ └── PrimaryMultiTableRepository.java
│ │ │ └── second
│ │ │ └── SecondMultiTableRepository.java
│ │ └── resources
│ │ └── application.yml
│ └── test
│ └── java
│ └── com.xkcoding.multi.datasource.jpa
│ └── SpringBootDemoMultiDatasourceJpaApplicationTests.java
└── target

Tham khảo

  1. https:// gian shu /p/34730e595a8c
  2. https://blog.csdn.net/anxpp/article/details/52274120