赞
踩
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
定义两个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(); } }
指定数据源对应的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()); } }
@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多数据源
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。