Springboot使用JPA配置多数据源
本人在最近的项目中,需要使用JPA配置两个数据源来完成一些功能,以此记录配置过程。方便以后使用:
第一步:配置文件中加入相应的配置。
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.jpa.database=mysql
#预发环境数据库
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/toutiao?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
#预发环境数据库
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/driver_manager?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
第二步:加入对应的配置类。
1、DataSourceConfig类,配置两个数据源。
@Configuration public class DataSourceConfig { @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @Primary @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDbDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDbDataSource() { return DataSourceBuilder.create().build(); } }
2、主数据源配置类,PrimaryConfig类。
@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactoryPrimary", transactionManagerRef = "transactionManagerPrimary", basePackages = {"com.kunkun.jpa.primary"} //需要修改的地方 ) public class PrimaryConfig { private String url; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @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()) .packages("com.kunkun.jpa.model.primary") //设置实体类所在位置与副数据源区分,需要修改 .persistenceUnit("primaryPersistenceUnit") .build(); } private Map getVendorProperties() { HashMapproperties = new HashMap<>(); properties.put("hibernate.dialect", env.getProperty("hibernate.dialect")); properties.put("hibernate.ddl-auto", "create"); properties.put("hibernate.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy"); properties.put("hibernate.implicit_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy"); return properties; } @Autowired private Environment env; @Primary @Bean(name = "transactionManagerPrimary") public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); } }
3、SecondaryConfig,辅数据源配置
@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactorySecondary", transactionManagerRef = "transactionManagerSecondary", basePackages = {"com.kunkun.jpa.secondary"}) //设置DAO接口层所在包位置与主数据源区分 public class SecondaryConfig { @Autowired @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; @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()) .packages("com.kunkun.jpa.model.secondary") //设置实体类所在包的位置与主数据源区分 .persistenceUnit("primaryPersistenceUnit") .build(); } private Map getVendorProperties() { HashMapproperties = new HashMap<>(); properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); properties.put("hibernate.ddl-auto", env.getProperty("update")); properties.put("hibernate.dialect", env.getProperty("hibernate.dialect")); properties.put("hibernate.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy"); properties.put("hibernate.implicit_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy"); return properties; } @Autowired private Environment env; @Bean(name = "transactionManagerSecondary") PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject()); } }
第三步:设置实体类所在位置
实体类:
@Entity @Data @Table(name = "user") public class User { @Id private Integer id; /** * 名字 */ private String name; /** * 密码 */ private String password; }
DAO类:
public interface UserDao extends JpaRepository, JpaSpecificationExecutor { /** * 根据title查数据 * * @param id * @return */ @Transactional @Query("SELECT dr.name from User dr where dr.id = :id") String findDataByTitle(@Param("id") Integer id); }
上面标红的地方是需要修改的地方,对于配置文件和数据源配置类的部分是可以修改的。建议名字不修改,直接复制就好了。