jpa多数据源配置
因为本人在学习jpa多数据源配置的时候,查到很多资料,发现里面有些小的坑很多文章没有写出来,导致花费冤枉时间,因此写了这篇文章,以供后来者学习是不必重复的采坑。
spring:
datasource:
test1:
password: ****
username: root
jdbc-url: jdbc:mysql://localhost:3306/**?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
test2:
password: ****
username: root
jdbc-url: jdbc:mysql://localhost:3306/***?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
database-platform: org.hibernate.dialect.MySQLDialect //设置方言,这个为必须设置项
show-sql: true
配置数据源是不能有URL,要用jdbc-url,否则会报错
注册DataSource
@Configuration
public class datasource {
/**
* 返回data2数据库的数据源
* @return
*/
@Primary
@Qualifier("dataSource1")
@Bean(name="dataSource1")
@ConfigurationProperties(prefix = "spring.datasource.test1") // 数据源配置路径
public DataSource dataSource1(){
return DataSourceBuilder.create().build();
}
/**
* 返回data2数据库的数据源
* @return
*/
@Qualifier("dataSource2")
@Bean(name="dataSource2")
@ConfigurationProperties(prefix = "spring.datasource.test2")
public DataSource dataSource2(){
return DataSourceBuilder.create().build();
}
}
@Configuration
@EnableJpaRepositories(basePackages = "com.project.datasource.repositry1",//dao层文件路径
entityManagerFactoryRef = "entityManagerFactoryPrimary1",
transactionManagerRef = "transactionManagerPrimary1")
public class datasource1 {
@Autowired
@Qualifier("dataSource1")
private DataSource primaryDataSource;
@Autowired
JpaProperties jpaProperties;
@Primary
@Bean(name="entityManagerPrimary1")
public EntityManager entityManager(EntityManagerFactoryBuilder builder){
return entityManagerFactoryBean(builder).getObject().createEntityManager();
}
@Primary
@Bean(name="entityManagerFactoryPrimary1")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(
EntityManagerFactoryBuilder builder){
return builder
.dataSource(primaryDataSource)
.properties(jpaProperties.getProperties())//获取jdbc的配置
.packages("com.project.datasource.entity")//实体类路径
.persistenceUnit("primaryPersistenceUnit")
.build();
}
@Primary
@Bean(name="transactionManagerPrimary1")
public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder){
return new JpaTransactionManager(entityManagerFactoryBean(builder).getObject());
}
}
然后注册dao层即可使用,小编在使用的时候发现其讲实体类转化为sql时,不能将实体类名驼峰化,例如:userName转化成user_name,这个问题待应该有解决的办法,但是目前没有找到相应的方法,如果有解决了的小伙伴,请下方留言,谢谢。