由于現(xiàn)在很多系統(tǒng)都不在使用單一數(shù)據(jù)庫,所以想試下springboot jpa多數(shù)據(jù)源配置纸巷,網(wǎng)上也有很多這方便的文章,可能是版本不一致眶痰,存在這各種問題瘤旨,始終無法成功運(yùn)行,后經(jīng)過反復(fù)嘗試竖伯,最后終于成功運(yùn)行存哲,這里做下記錄:
springboot 版本:2.2.2.RELEASE
數(shù)據(jù)庫:mysql 5.7
開發(fā)工具:idea 2019.2
1、首先要有多個(gè)數(shù)據(jù)庫七婴,我這里創(chuàng)建了2個(gè)數(shù)據(jù)庫demo祟偷、demo2
2、創(chuàng)建項(xiàng)目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo1</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2打厘、application.yml
spring:
datasource:
ds1:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 1234
ds2:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/demo2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 1234
jpa:
hibernate:
ddl-auto: update
open-in-view: true
properties:
hibernate:
physical_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
implicit_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
dialect: org.hibernate.dialect.MySQL57Dialect
format_sql: true
hbm2ddl:
auto: update
show-sql: true
database: mysql
配置說明:
springboot默認(rèn)使用的HikariPool數(shù)據(jù)源修肠,數(shù)據(jù)源配置應(yīng)使用jdbc-url,而不是常用的url。單個(gè)數(shù)據(jù)源時(shí)使用的spring.jpa.hibernate下的配置户盯,而使用多數(shù)據(jù)源時(shí)則使用的是spring.jpa.hibernate.properties下的配置嵌施,具體配置網(wǎng)上有很多數(shù)據(jù)饲化,在此就不多做說明,不清楚的可以網(wǎng)上查一下艰管。這里就提一下physical_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
implicit_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
這兩個(gè)配置是創(chuàng)建表時(shí)表字段使用下劃線形式滓侍,而不是駝峰形式,若不配置牲芋,表字段和實(shí)體屬性一致撩笆。
3、實(shí)體類缸浦,此處創(chuàng)建兩個(gè)實(shí)體類夕冲,分別對(duì)應(yīng)demo、demo2兩個(gè)數(shù)據(jù)庫
Person類
@Entity
@Table(name = "d_person")
public class Person implements Serializable {
private static final long serialVersionUID = 580119470723651341L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String personNo;
private String name;
private Integer age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPersonNo() {
return personNo;
}
public void setPersonNo(String personNo) {
this.personNo = personNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
Student類
@Entity
@Table(name = "d_student")
public class Student implements Serializable {
private static final long serialVersionUID = 7993941906610435818L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String studentNo;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getStudentNo() {
return studentNo;
}
public void setStudentNo(String studentNo) {
this.studentNo = studentNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4裂逐、Repository類
@Repository
public interface PersonRepository extends BaseRepository<Person,Long> {
}
@Repository
public interface StudentRepository extends BaseRepository<Student,Long> {
}
這里的BaseRepository是我自己定義的接口歹鱼,主要繼承了Repository接口
5、配置類
DataSourceConfigDs1和DataSourceConfigDs2分別對(duì)應(yīng)demo卜高、demo2
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryDs1",//配置連接工廠 entityManagerFactory
transactionManagerRef = "transactionManagerDs1", //配置 事物管理器 transactionManager
basePackages = {"com.example.demo1.repository.ds1"}
)
public class DataSourceConfigDs1 {
@Bean(name = "ds1")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.ds1")
public DataSource dataSourceDs1(){
return DataSourceBuilder.create().build();
}
@Autowired
private JpaProperties jpaProperties;
@Bean("entityManagerDs1")
@Primary
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryBean(builder).getObject().createEntityManager();
}
@Bean("entityManagerFactoryDs1")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
return builder.dataSource(dataSourceDs1())
.properties(jpaProperties.getProperties())
.packages("com.example.demo1.repository.ds1")
//持久化單元名稱弥姻,當(dāng)存在多個(gè)EntityManagerFactory時(shí),需要制定此名稱
.persistenceUnit("persistenceUnitDs1")
.build();
}
@Bean("transactionManagerDs1")
@Primary
public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryBean(builder).getObject());
}
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryDs2",//配置連接工廠 entityManagerFactory
transactionManagerRef = "transactionManagerDs2", //配置 事物管理器 transactionManager
basePackages = {"com.example.demo1.repository.ds2"}
)
public class DataSourceConfigDs2 {
@Bean(name = "ds2")
@ConfigurationProperties(prefix = "spring.datasource.ds2")
public DataSource dataSourceDs2(){
return DataSourceBuilder.create().build();
}
@Autowired
private JpaProperties jpaProperties;
@Bean("entityManagerDs2")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryBean(builder).getObject().createEntityManager();
}
@Bean(value = "entityManagerFactoryDs2")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
return builder.dataSource(dataSourceDs2())
.properties(jpaProperties.getProperties())
.packages("com.example.demo1.repository.ds2")
//持久化單元名稱掺涛,當(dāng)存在多個(gè)EntityManagerFactory時(shí)庭敦,需要制定此名稱
.persistenceUnit("persistenceUnitDs2")
.build();
}
@Bean("transactionManagerDs2")
public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryBean(builder).getObject());
}
}
配置多數(shù)據(jù)源時(shí)需要指定主數(shù)據(jù)源,使用@Primary即可薪缆。basePackages 為Reporitory類路徑秧廉,對(duì)應(yīng)的實(shí)體類應(yīng)該在Repository類路徑下。
項(xiàng)目啟動(dòng)后可以看到控制臺(tái)有sql打蛹鹈薄:
通過navicat工具查看:
表結(jié)構(gòu):
由上圖可以看出字段為下劃線格式
到此整個(gè)springboot jpa多數(shù)源的配置過程就完成了疼电。
代碼github:https://github.com/panli1988/demo1/tree/master/src/main/java/com/example/demo1