spring data jpa 多数据源
2017-12-12 18:34
435 查看
由于业务需要把原来项目的单数据源变成了两个数据源,方式和mybatis的差不多但是还是要在这里记录一下,顺便记录一下花了一个多小时解决的坑。首先看一下配置文件:
spring.datasource.primary.url=ip1 spring.datasource.primary.username=username1 spring.datasource.primary.password=password1 spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver spring.datasource.secondary.url=ip2 spring.datasource.secondary.username=username2 spring.datasource.secondary.password=password2 spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver三个Java文件:
@Configuration public class DataSourceConfig { @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @Primary @ConfigurationProperties(prefix="spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @ConfigurationProperties(prefix="spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } } @Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef="entityManagerFactoryPrimary", transactionManagerRef="transactionManagerPrimary", basePackages= { "com.txxs.dao1" }) //设置Repository所在位置 public class PrimaryConfig { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Autowired private JpaProperties jpaProperties; @Primary @Bean(name = "entityManagerPrimary") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactoryPrimary(builder).getObject().createEntityManager(); } @Primary @Bean(name = "entityManagerFactoryPrimary") public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) { return builder .dataSource(primaryDataSource) .properties(getVendorProperties(primaryDataSource)) .packages("com.txxs.po1") //设置实体类所在位置 .persistenceUnit("primaryPersistenceUnit") .build(); } private Map<String, String> getVendorProperties(DataSource dataSource) { return jpaProperties.getHibernateProperties(dataSource); } @Primary @Bean(name = "transactionManagerPrimary") public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); } } @Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef="entityManagerFactorySecondary", transactionManagerRef="transactionManagerSecondary", basePackages= { "com.txxs.dao2" }) //设置Repository所在位置 public class SecondaryConfig { @Autowired @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; @Autowired private JpaProperties jpaProperties; @Bean(name = "entityManagerSecondary") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactorySecondary(builder).getObject().createEntityManager(); } @Bean(name = "entityManagerFactorySecondary") public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) { return builder .dataSource(secondaryDataSource) .properties(getVendorProperties(secondaryDataSource)) .packages("com.txxs.po2") //设置实体类所在位置 .persistenceUnit("secondaryPersistenceUnit") .build(); } private Map<String, String> getVendorProperties(DataSource dataSource) { return jpaProperties.getHibernateProperties(dataSource); } @Bean(name = "transactionManagerSecondary") PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject()); } }这样就可以实现spring data jpa的多数据源了,还是很简单的,有个问题是在实现的过程中总是会去加载第一个数据源,而不加载第二个数据源,报的错误如下:
14:49:22.316 [http-nio-9102-exec-2] INFO c.txxs.task.ask - com.Aspect#aspect:50 - action=GET/v1/ Hibernate: select t.* from table1 t where ENAME like 'like%' 14:49:26.466 [http-nio-9102-exec-2] WARN o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 1146, SQLState: 42S02 14:49:26.467 [http-nio-9102-exec-2] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Table 'datasource.table1' doesn't existtable1是数据源2中的表,怎么解决呢,添加如下注解,原因是@Autowired默认按照类型进行注入,加上@Qualifier后spring注解按照里边的字符串的名字进行注入了
@Qualifier("secondaryDataSource") private DataSource secondaryDataSource;
相关文章推荐
- spring Data jpa简介_动力节点Java学院整理
- Spring3+Hibernate3(Jpa) 配置多个数据源的解决方案(基于注解)
- jpa+spring配置多数据源
- spring+jpa 两个数据源配置
- 4. Spring Boot 1.2.5,Spring Data JPA多数据源支持
- 【原创】Spring-boot快速入门(二)JPA数据源--转载请注明出处
- spring 配置多个数据源(基于JPA)
- Spring Data系列之Jpa(一)
- spring data jpa项目数据库的数据被清空问题
- 关于JPA多数据源的部署persistence.xml文件配置以及对应实现类注入
- spring data jpa 多对一联表查询
- jpa--数据源配置方法persistence.xml
- Spring Data JPA 学习记录1 -- 单向1:N关联的一些问题
- spring+jpa 两个数据源配置
- Spring Data JPA进阶——Specifications和Querydsl
- spring data jpa的学习总结
- Spring Data JPA进阶——Specifications和Querydsl
- Spring Data 系列之JPA(一)CrudRepository,PagingAndSortingRepository,JpaRepository
- Spring3+Hibernate3(Jpa) 配置多个数据源的解决方案(基于注解)