jpa多数据源配置示例代码
时间: 2023-05-28 20:06:39 浏览: 60
以下是一个基于Spring Boot和JPA的多数据源配置示例代码:
1. 在application.properties文件中配置数据源
```
# 主数据源
spring.datasource.url=jdbc:mysql://localhost:3306/main_db?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 第二个数据源
second.datasource.url=jdbc:mysql://localhost:3306/second_db?useSSL=false&serverTimezone=UTC
second.datasource.username=root
second.datasource.password=root
second.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
```
2. 创建两个数据源的实例
```
@Configuration
@EnableTransactionManagement
public class DataSourceConfig {
// 主数据源
@Bean(name = "mainDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource mainDataSource() {
return DataSourceBuilder.create().build();
}
// 第二个数据源
@Bean(name = "secondDataSource")
@ConfigurationProperties(prefix = "second.datasource")
public DataSource secondDataSource() {
return DataSourceBuilder.create().build();
}
}
```
3. 创建EntityManagerFactory实例
```
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.main_db.repository",
entityManagerFactoryRef = "mainEntityManagerFactory",
transactionManagerRef = "mainTransactionManager"
)
public class MainDbConfig {
@Autowired
@Qualifier("mainDataSource")
private DataSource mainDataSource;
@Bean(name = "mainEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean mainEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(mainDataSource)
.packages("com.example.main_db.entity")
.persistenceUnit("mainPersistenceUnit")
.build();
}
@Bean(name = "mainTransactionManager")
public PlatformTransactionManager mainTransactionManager(@Qualifier("mainEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
```
4. 创建第二个数据源的EntityManagerFactory实例
```
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.second_db.repository",
entityManagerFactoryRef = "secondEntityManagerFactory",
transactionManagerRef = "secondTransactionManager"
)
public class SecondDbConfig {
@Autowired
@Qualifier("secondDataSource")
private DataSource secondDataSource;
@Bean(name = "secondEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondDataSource)
.packages("com.example.second_db.entity")
.persistenceUnit("secondPersistenceUnit")
.build();
}
@Bean(name = "secondTransactionManager")
public PlatformTransactionManager secondTransactionManager(@Qualifier("secondEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
```
5. 在需要使用的Repository中指定使用哪个EntityManagerFactory
```
@Repository
@Transactional(transactionManager = "mainTransactionManager")
public interface MainDbRepository extends JpaRepository<MainEntity, Long> {
}
@Repository
@Transactional(transactionManager = "secondTransactionManager")
public interface SecondDbRepository extends JpaRepository<SecondEntity, Long> {
}
```
这样就完成了基于Spring Boot和JPA的多数据源配置。在需要访问不同的数据库时,只需要在Repository中指定对应的TransactionManager即可。