让我来为你详细讲解“Spring Boot整合持久层之JPA多数据源”的完整攻略。
1. 环境准备
本文假设你已经安装了以下软件:
- JDK 1.8或更高版本
- MySQL数据库
- Eclipse或IntelliJ IDEA等开发工具
此外,还需要引入以下依赖包:
- Spring Boot Starter Data JPA
- MySQL JDBC Driver(如果你选择的是其他数据库,则需要对应的驱动器)
2. 多数据源配置
在使用多数据源之前,需要在应用程序中配置这些数据源。基本上,有两种方法可以实现这个目标。
首先,你可以使用Spring的@Profile注解。@Profile注解基于环境或应用程序配置策略来打标记。例如,你可以在开发环境和生产环境之间切换数据源。
其次,你可以在配置文件中配置多个数据源。在本示例中,我们将使用这种方法。
在应用程序的application.properties文件中,配置两个数据源的信息。下面是一个示例配置:
# 配置主数据源
spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
# 配置从数据源
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
注意,我们定义了两个数据源:一个主数据源和一个从数据源。每个数据源都有它们自己的连接URL、用户名、密码和驱动程序名称。
3. 整合JPA
现在,我们已经配置了多个数据源,接下来是整合JPA。这里我们使用的是Hibernate框架作为JPA的实现。
在pom.xml文件中添加以下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.12.Final</version>
</dependency>
接下来创建两个jpa配置类分别对应两个数据源。
3.1 主数据源配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryPrimary",
transactionManagerRef = "transactionManagerPrimary",
basePackages = {"com.example.demo.primary"}
)
public class PrimaryConfig {
@Primary
@Bean(name = "dataSourcePrimary")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource dataSourcePrimary(){
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(
EntityManagerFactoryBuilder builder,
@Qualifier("dataSourcePrimary") DataSource dataSource){
return builder
.dataSource(dataSource)
.packages("com.example.demo.primary")
.persistenceUnit("primary")
.build();
}
@Primary
@Bean(name = "transactionManagerPrimary")
public PlatformTransactionManager transactionManagerPrimary(
@Qualifier("entityManagerFactoryPrimary") EntityManagerFactory entityManagerFactory){
return new JpaTransactionManager(entityManagerFactory);
}
}
在主数据源配置类中,我们指定了以下事项:
- 配置数据源
- 配置JPA的实体管理器工厂
- 配置JPA的事务管理器
3.2 从数据源配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactorySecondary",
transactionManagerRef = "transactionManagerSecondary",
basePackages = {"com.example.demo.secondary"}
)
public class SecondaryConfig {
@Bean(name = "dataSourceSecondary")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource dataSourceSecondary(){
return DataSourceBuilder.create().build();
}
@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(
EntityManagerFactoryBuilder builder,
@Qualifier("dataSourceSecondary") DataSource dataSource){
return builder
.dataSource(dataSource)
.packages("com.example.demo.secondary")
.persistenceUnit("secondary")
.build();
}
@Bean(name = "transactionManagerSecondary")
public PlatformTransactionManager transactionManagerSecondary(
@Qualifier("entityManagerFactorySecondary") EntityManagerFactory entityManagerFactory){
return new JpaTransactionManager(entityManagerFactory);
}
}
我们在示例中配置了一个主数据源和一个辅助数据源。它们分别对应了两个不同的JPA实体管理器工厂和事务管理器。
4. 编写实体类
创建两个实体类对应两个数据源,分别命名为PrimaryDemo和SecondaryDemo。
@Entity
@Table(name = "primary_demo")
public class PrimaryDemo {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private int age;
// getters and setters
}
@Entity
@Table(name = "secondary_demo")
public class SecondaryDemo {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private int age;
// getters and setters
}
5. 编写DAO类
创建两个DAO类对应两个数据源,分别命名为PrimaryDemoRepository和SecondaryDemoRepository。
@Repository
public interface PrimaryDemoRepository extends JpaRepository<PrimaryDemo, Long> {
}
@Repository
public interface SecondaryDemoRepository extends JpaRepository<SecondaryDemo, Long> {
}
6. 编写Controller
创建一个RESTful API,通过不同的路由映射到上面的两个DAO类中的方法。
@RestController
@RequestMapping(path="/demo")
public class DemoController {
@Autowired
private PrimaryDemoRepository primaryDemoRepository;
@Autowired
private SecondaryDemoRepository secondaryDemoRepository;
@GetMapping(path="/primary")
public @ResponseBody Iterable<PrimaryDemo> getAllPrimaryDemos() {
return primaryDemoRepository.findAll();
}
@GetMapping(path="/secondary")
public @ResponseBody Iterable<SecondaryDemo> getAllSecondaryDemos() {
return secondaryDemoRepository.findAll();
}
}
7. 总结
现在,我们已经完成了Spring Boot整合持久层之JPA多数据源的攻略。在这个攻略中,我们演示了如何配置两个不同的数据源,并将它们与两个不同的JPA实体管理器工厂和事务管理器关联。此外,我们还演示了如何编写实体类、DAO类和Controller,并通过RESTful API公开这些DAO类中的操作。
希望这个攻略能够帮助你更好地理解如何在Spring Boot中维护多个数据源。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot整合持久层之JPA多数据源 - Python技术站