23、Spring Data JPA 实战 - JPA配置多个数据源

使用之前配置的两个DataSource,配置类如下:

MultiDataSourceApplication:

/**
 * 启动类
 * @author DDKK.COM 弟弟快看,程序员编程资料站
 */
@EnableAsync
@SpringBootApplication
@EnableTransactionManagement
public class MultiDataSourceApplication{
    public static void main(String[] args) {
        SpringApplication.run(MultiDataSourceApplication.class, args);
    }
}

JpaDataSourceOneConfig:

/**
 *
 * @author DDKK.COM 弟弟快看,程序员编程资料站
 */
@Configuration
@Profile("multi-datasource")
@AutoConfigureAfter(MultiDataSourceConfig.class)
@EnableJpaAuditing(auditorAwareRef = "idAuditorAwareImpl")
@EnableJpaRepositories(basePackages = "cn.caofanqi.study.studyspringdatajpa.repository",
        entityManagerFactoryRef = "entityManagerFactoryOne",
        transactionManagerRef = "transactionManagerOne")
public class JpaDataSourceOneConfig {

    @Resource
    private DataSource dataSourceOne;
    @Bean
    @Primary
    PlatformTransactionManager transactionManagerOne() {
        return new JpaTransactionManager(entityManagerFactoryOne().getObject());
    }

    @Bean
    @Primary
    LocalContainerEntityManagerFactoryBean entityManagerFactoryOne() {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);
        vendorAdapter.setShowSql(true);

        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();

        factoryBean.setDataSource(dataSourceOne);
        factoryBean.setJpaVendorAdapter(vendorAdapter);
        factoryBean.setPackagesToScan("cn.caofanqi.study.studyspringdatajpa.pojo.domain");

        return factoryBean;
    }
    @Bean(name = "idAuditorAwareImpl")
    public AuditorAware<Long> idAuditorAwareImpl() {
        return new IdAuditorAwareImpl();
    }

}

JpaDataSourceTwoConfig:

/**
 *
 * @author DDKK.COM 弟弟快看,程序员编程资料站
 */
@Configuration
@Profile("multi-datasource")
@AutoConfigureAfter(MultiDataSourceConfig.class)
@EnableJpaRepositories(basePackages = "cn.caofanqi.study.studyspringdatajpa.multijpa",
        entityManagerFactoryRef = "entityManagerFactoryTwo",
        transactionManagerRef = "transactionManagerTwo")
public class JpaDataSourceTwoConfig {

    @Resource
    private DataSource dataSourceTwo;
    @Bean
    PlatformTransactionManager transactionManagerTwo() {
        return new JpaTransactionManager(entityManagerFactoryTwo().getObject());
    }

    @Bean
    LocalContainerEntityManagerFactoryBean entityManagerFactoryTwo() {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);
        vendorAdapter.setShowSql(true);

        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();

        factoryBean.setDataSource(dataSourceTwo);
        factoryBean.setJpaVendorAdapter(vendorAdapter);
        factoryBean.setPackagesToScan("cn.caofanqi.study.studyspringdatajpa.pojo.domain2");

        return factoryBean;
    }
}

测试用例类:

@Rollback(false)
@SpringBootTest(classes = MultiDataSourceApplication.class)
@ActiveProfiles("multi-datasource")
class UserOrderRepositoryTest {
    @Resource
    private UserRepository userRepository;

    @Resource
    private UserOrderRepository userOrderRepository;

    @Resource
    private PlatformTransactionManager transactionManagerOne;

    @Resource
    private PlatformTransactionManager transactionManagerTwo;

    @Test
    @Transactional
    void testSaveUser() {
        User user = new User();
        user.setUsername("张三");
        user.setAge(23);
        user.setPhone("13656785678");
        userRepository.save(user);
    }

    @Test
    @Transactional
    void testSaveUserOrder() {
        User user = userRepository.findByUsername("张三");

        UserOrder userOrder = new UserOrder();
        userOrder.setOrderName(user.getUsername() + "的订单");
        userOrder.setUserId(user.getId());
        userOrder.setCreateTime(LocalDate.now());

        userOrderRepository.save(userOrder);

    }
    @Test
    @Transactional
    void testSave() {

        TransactionStatus statusOne = transactionManagerOne.getTransaction(new DefaultTransactionDefinition());
        TransactionStatus statusTwo = transactionManagerTwo.getTransaction(new DefaultTransactionDefinition());

        try {
            User user = new User();
            user.setUsername("李四");
            user.setAge(23);
            user.setPhone("123456");
            Long userId = userRepository.save(user).getId();

            int i = 1 / 0 ;

            UserOrder userOrder = new UserOrder();
            userOrder.setOrderName(user.getUsername() + "的订单");
            userOrder.setUserId(userId);
            userOrder.setCreateTime(LocalDate.now());

            userOrderRepository.save(userOrder);

            transactionManagerOne.commit(statusOne);
            transactionManagerTwo.commit(statusTwo);

        }catch (Exception e){
            transactionManagerOne.rollback(statusOne);
            transactionManagerTwo.rollback(statusTwo);
        }

    }

}

源码地址:https://github.com/caofanqi/study-spring-data-jpa