SpringBoot JPA 配置多个数据库
一、application.yml :
primary为主数据源配置,secondary为第二数据源配置
spring:
application:
name: test
jpa:
hibernate:
ddl-auto: update
show-sql: true
datasource:
primary:
jdbc-url: jdbc:mysql://127.0.0.1:3306/laboratory
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
secondary:
jdbc-url: jdbc:mysql://127.0.0.1:3306/test
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
二、创建一个SpringBoot配置类
定义两个DataSource来读取application.yml中的不同配置。
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@Primary
@ConfigurationProperties(prefix="spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
三、primary数据源的JPA配置
指定数据源对应的Entity实体和Repository定义的位置,用@Primary来区分主数据源。JPA实体类重写:entityManagerFactoryPrimary
JPA事务重写:transactionManagerPrimary
@Configuration
@EnableTransactionManagement //事务管理器
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryPrimary",
transactionManagerRef = "transactionManagerPrimary",
basePackages = {"cn.ntshare.laboratory.domain.master"}
) //定义JPA内部参数
public class PrimarySourceConfig {
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Resource
private Properties jpaProperties;
@Autowired
private HibernateProperties hibernateProperties;
private Map<String, Object> getVendorProperties(DataSource dataSource){
return hibernateProperties.datermineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
}
@Primary
@Bean(name = "entityManagerPrimary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
}
@Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean entityManagerFactory = builder
.dataSource(primaryDataSource)
.properties(getVendorProperties(primaryDataSource))
.packages("cn.ntshare.laboratory.domain.master") //设置实体类所在位置
.persistenceUnit("primaryPersistenceUnit")
.build();
entityManagerFactory.setJpaProperties(jpaProperties);
return entityManagerFactory;
}
@Primary
@Bean(name = "transactionManagerPrimary")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}
}
四、secondary数据源的JPA配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactorySecondary",
transactionManagerRef="transactionManagerSecondary",
basePackages= { "cn.ntshare.laboratory.domain.slave" }) //设置Repository所在位置
public class SecondarySourceConfig {
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
@Bean(name = "entityManagerSecondary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactorySecondary(builder).getObject().createEntityManager();
}
@Resource
private Properties jpaProperties;
@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean entityManagerFactory = builder
.dataSource(secondaryDataSource)
.packages("cn.ntshare.laboratory.domain.slave") //设置实体类所在位置
.persistenceUnit("secondaryPersistenceUnit")
.build();
entityManagerFactory.setJpaProperties(jpaProperties);
return entityManagerFactory;
}
@Bean(name = "transactionManagerSecondary")
PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
}
}
主数据源的实体和数据访问对象位于:cn.ntshare.laboratory.domain.master
次数据源的实体和数据访问对象位于:cn.ntshare.laboratory.domain.slave
参考文章:
[1] SpringBoot 连接多个数据库
[2] SpringBoot配置JPA多数据源