JPA多数据源配置

配置文件

方法1

1
2
3
4
5
6
7
8
9
10
11
12
spring:
datasource:
primary-method-1:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/database1
username: root
password: root
other-method-1:
driver-class-name: ...
url: ...
username: ...
password: ...

方法2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring:
datasource:
primary-method-2:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/database1
username: root
password: root
max-lifetime: ...
...
other-method-2:
driver-class-name: ...
jdbc-url: ...
username: ...
password: ...
...

数据源配置

方法1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Configuration
public class PrimaryDataSourceConfig {
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource.primary-method-1")
public DataSourceProperties primaryDataSourceProperties() {
return new DataSourceProperties();
}

@Bean
@Primary
public DataSource primaryDataSource(
@Qualifier("primaryDataSourceProperties") DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
public class OtherDataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.other-method-1")
public DataSourceProperties otherDataSourceProperties() {
return new DataSourceProperties();
}

@Bean
public DataSource otherDataSource(
@Qualifier("otherDataSourceProperties") DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}

方法2

1
2
3
4
5
6
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource.primary-method-2")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
1
2
3
4
5
@Bean
@ConfigurationProperties(prefix = "spring.datasource.other-method-2")
public DataSource otherDataSource() {
return DataSourceBuilder.create().build();
}
  • 若想要手动配置数据源并且对数据源的配置更有精确的控制,可以使用DataSourceBuilder.create().build()
  • 若想要使用应用程序的配置(通常在 application.propertiesapplication.yml 文件中配置)来配置数据源,可以使用 properties.initializeDataSourceBuilder().build()

JPA配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@Configuration
@EnableJpaRepositories(
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "primaryTransactionManager",
basePackages = "cc.mousse.repository.primary")
@EnableTransactionManagement
public class PrimaryJpaConfig {
@Resource JpaProperties jpaProperties;

@Bean
@Primary
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(
@Qualifier("primaryDataSource") DataSource dataSource, EntityManagerFactoryBuilder builder) {
return builder
.dataSource(dataSource)
.properties(jpaProperties.getProperties())
.packages("cc.mousse.entity.primary")
.persistenceUnit("primaryPersistenceUnit")
.build();
}

@Bean
@Primary
public EntityManager primaryEntityManager(
@Qualifier("primaryEntityManagerFactory") EntityManagerFactory factory) {
return factory.createEntityManager();
}

@Bean
@Primary
public PlatformTransactionManager primaryTransactionManager(
@Qualifier("primaryEntityManagerFactory") EntityManagerFactory factory) {
return new JpaTransactionManager(factory);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Configuration
@EnableJpaRepositories(
entityManagerFactoryRef = "otherEntityManagerFactory",
transactionManagerRef = "otherTransactionManager",
basePackages = "cc.mousse.repository.other")
@EnableTransactionManagement
public class OtherJpaConfig {
@Resource JpaProperties jpaProperties;

@Bean
public LocalContainerEntityManagerFactoryBean otherEntityManagerFactory(
@Qualifier("otherDataSource") DataSource dataSource, EntityManagerFactoryBuilder builder) {
return builder
.dataSource(dataSource)
.properties(jpaProperties.getProperties())
.packages("cc.mousse.entity.other")
.persistenceUnit("otherPersistenceUnit")
.build();
}

@Bean
public EntityManager otherEntityManager(
@Qualifier("otherEntityManagerFactory") EntityManagerFactory factory) {
return factory.createEntityManager();
}

@Bean
public PlatformTransactionManager otherTransactionManager(
@Qualifier("otherEntityManagerFactory") EntityManagerFactory factory) {
return new JpaTransactionManager(factory);
}
}

问题

无法自动装配。找不到 'xxx' 类型的 Bean。

  • @SpringBootApplication默认扫描范围是启动类所在的包及其子包
  • 要扫描本包以外的包,需要添加@SpringBootApplication(scanBasePackages = "cc.mousse")

JPA多数据源配置
http://docs.mousse.cc/JPA多数据源配置/
作者
Mocha Mousse
发布于
2024年11月26日
许可协议