JPA多数据源配置

配置文件

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

数据源配置

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-ds")
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-ds")
public DataSourceProperties otherDataSourceProperties() {
return new DataSourceProperties();
}

@Bean
public DataSource otherDataSource(
@Qualifier("otherDataSourceProperties") DataSourceProperties properties) {
return 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")