JPA 多数据源 样例
时间: 2023-09-28 10:11:23 浏览: 43
以下是一个使用 JPA 实现多数据源的示例:
1. 配置数据源
在 Spring Boot 应用程序中,我们可以在 `application.properties` 文件中轻松配置多个数据源。例如:
```
# 第一个数据源
spring.datasource.url=jdbc:mysql://localhost:3306/db1
spring.datasource.username=username1
spring.datasource.password=password1
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 第二个数据源
spring.datasource.second.url=jdbc:mysql://localhost:3306/db2
spring.datasource.second.username=username2
spring.datasource.second.password=password2
spring.datasource.second.driver-class-name=com.mysql.jdbc.Driver
```
2. 定义实体类和仓库
我们需要定义两个实体类和两个仓库,每个实体类和仓库对应一个数据源。例如:
第一个实体类:
```
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// 省略 getter 和 setter
}
```
第一个仓库:
```
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
```
第二个实体类:
```
@Entity
@Table(name = "product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// 省略 getter 和 setter
}
```
第二个仓库:
```
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
}
```
3. 配置数据源和 JPA
我们需要为每个数据源创建一个数据源对象和一个 JPA 实体管理器工厂对象。例如:
第一个数据源:
```
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.demo.repository.first",
entityManagerFactoryRef = "firstEntityManagerFactory",
transactionManagerRef = "firstTransactionManager"
)
public class FirstDataSourceConfig {
@Primary
@Bean(name = "firstDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "firstEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier("firstDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.demo.entity.first")
.persistenceUnit("first")
.build();
}
@Primary
@Bean(name = "firstTransactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("firstEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
```
第二个数据源:
```
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.demo.repository.second",
entityManagerFactoryRef = "secondEntityManagerFactory",
transactionManagerRef = "secondTransactionManager"
)
public class SecondDataSourceConfig {
@Bean(name = "secondDataSource")
@ConfigurationProperties(prefix = "spring.datasource.second")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier("secondDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.demo.entity.second")
.persistenceUnit("second")
.build();
}
@Bean(name = "secondTransactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("secondEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
```
4. 使用数据源
我们可以在需要使用数据源的地方,注入对应的仓库并使用它进行操作。例如:
```
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private ProductRepository productRepository;
@Transactional(value = "firstTransactionManager")
public void addUser(String name) {
User user = new User();
user.setName(name);
userRepository.save(user);
}
@Transactional(value = "secondTransactionManager")
public void addProduct(String name) {
Product product = new Product();
product.setName(name);
productRepository.save(product);
}
}
```
在上面的示例中,`addUser` 方法使用第一个数据源,而 `addProduct` 方法使用第二个数据源。我们可以在方法上添加 `@Transactional` 注解,并指定对应的事务管理器来使用对应的数据源。