jpa 多数据源配置
github网址:jpa多数据源配置
项目名:springboot-jpa-mulidata
注意事项:
- 重点:多数据源配置时,要指定一个数据源为主数据源并使用@Primary注解
- @EnableJpaRepositories(basePackages)配置repository
1.项目结构和配置流程
1.1配置流程
- 生成实体类
- 创建Repository类并继承
- 配置application.properties
- 配置dataSourceconfig
- 配置多数据源
2.配置说明
application.properties配置
test1.spring.datasource.driver-class-name = com.mysql.jdbc.Driver
#多数据源时,为jdbc-url
test1.spring.datasource.jdbc-url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8&useSSL=false
test1.spring.datasource.username = root
test1.spring.datasource.password = 0806
test2.spring.datasource.driver-Class-Name = com.mysql.jdbc.Driver
#多数据源时,为jdbc-url
test2.spring.datasource.jdbc-url = jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8&useSSL=false
test2.spring.datasource.username = root
test2.spring.datasource.password = 0806
# 第一次简表create 后面用update
spring.jpa.hibernate.ddl-auto= update
spring.jpa.show-sql= true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
多数据源1配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactoryTest1",
transactionManagerRef="transactionManagerTest1",
basePackages= { "com.plumblum.repository.Test1" })
public class RepositoryConfigTest1 {
/**
*
*/
@Autowired
private JpaProperties jpaProperties;
@Autowired
@Qualifier("test1DS")
private DataSource test1DS;
@Bean(name = "entityManagerTest1")
@Primary
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryTest1(builder).getObject().createEntityManager();
}
@Bean(name = "entityManagerFactoryTest1")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactoryTest1 (EntityManagerFactoryBuilder builder) {
return builder
//设置数据源
.dataSource(test1DS)
//设置数据源属性
.properties(getVendorProperties())
//设置实体类所在位置.扫描所有带有 @Entity 注解的类
.packages("com.plumblum.entity")
// Spring会将EntityManagerFactory注入到Repository之中.有了 EntityManagerFactory之后,
// Repository就能用它来创建 EntityManager 了,然后Entity就可以针对数据库执行操作
.persistenceUnit("test1PersistenceUnit")
.build();
}
private Map<String, Object> getVendorProperties() {
return jpaProperties.getHibernateProperties(new HibernateSettings());
}
@Bean(name = "transactionManagerTest1")
@Primary
PlatformTransactionManager transactionManagerTest1(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryTest1(builder).getObject());
}
}
多数据源2配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactoryTest2",
transactionManagerRef="transactionManagerTest2",
basePackages= { "com.plumblum.repository.Test2" })
public class RepositoryConfigTest2 {
@Autowired
private JpaProperties jpaProperties;
@Autowired
@Qualifier("test2DS")
private DataSource test2DS;
@Bean(name = "entityManagerTest2")
// @Primary
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryTest2(builder).getObject().createEntityManager();
}
@Bean(name = "entityManagerFactoryTest2")
// @Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactoryTest2 (EntityManagerFactoryBuilder builder) {
return builder
.dataSource(test2DS)
.properties(getVendorProperties())
.packages("com.plumblum.entity") //设置实体类所在位置
.persistenceUnit("test2PersistenceUnit")
.build();
}
private Map<String, Object> getVendorProperties() {
return jpaProperties.getHibernateProperties(new HibernateSettings());
}
@Bean(name = "transactionManagerTest2")
// @Primary
PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryTest2(builder).getObject());
}
}
dataSource配置
@Configuration
public class DataSourceConfig {
@Bean(name = "test1DS")
@Qualifier("test1DS")
// 设置主数据库
@Primary
@ConfigurationProperties(prefix="test1.spring.datasource")
public DataSource test1DataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "test2DS")
@Qualifier("test2DS")
@ConfigurationProperties(prefix="test2.spring.datasource")
public DataSource test2DataSource(){
return DataSourceBuilder.create().build();
}
}
3测试和结果展示
测试方法
测试结果