content: package org.superboot.config.datasource;
  
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.beans.factory.annotation.Qualifier;
  import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
  import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.context.annotation.Primary;
  import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
  import org.springframework.orm.jpa.JpaTransactionManager;
  import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
  import org.springframework.transaction.PlatformTransactionManager;
  import org.springframework.transaction.annotation.EnableTransactionManagement;
  import org.superboot.base.BaseConstants;
  
  import javax.persistence.EntityManagerFactory;
  
  /**
   * <b> 读写分离配置及事务管理 </b>
   * <p>
   * 功能描述:提供事务支持及读写分离等操作支持
   * </p>
   */
  @Configuration
  @EnableTransactionManagement
  @EnableJpaRepositories(basePackages = "org.superboot.dao.jpa",
          entityManagerFactoryRef = "dataEntityManagerFactory",
          transactionManagerRef = "dataTransactionManager")
  public class DataSourceTransactionConfig {
  
      @Autowired
      private JpaProperties jpaProperties;
  
  
      @Autowired
      @Qualifier("routingDataSource")
      private AbstractRoutingDataSource dataSource;
  
      /**
       * 我们通过LocalContainerEntityManagerFactoryBean来获取EntityManagerFactory实例
       *
       * @return
       */
      @Bean(name = "dataEntityManagerFactoryBean")
      public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
          return builder
                  .dataSource(dataSource)
                  .properties(jpaProperties.getProperties())
                  //设置实体类所在位置
                  .packages("org.superboot.entity.jpa")
                  .persistenceUnit("dataPersistenceUnit")
                  .build();
      }
  
      /**
       * EntityManagerFactory类似于Hibernate的SessionFactory,mybatis的SqlSessionFactory
       * 总之,在执行操作之前,我们总要获取一个EntityManager,这就类似于Hibernate的Session,
       * mybatis的sqlSession.
       *
       * @param builder
       * @return
       */
      @Bean(name = "dataEntityManagerFactory")
      @Primary
      public EntityManagerFactory entityManagerFactory(EntityManagerFactoryBuilder builder) {
          return this.entityManagerFactoryBean(builder).getObject();
      }
  
      /**
       * 配置事物管理器
       *
       * @return
       */
      @Bean(name = "dataTransactionManager")
      @Primary
      public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
          return new JpaTransactionManager(entityManagerFactory(builder));
      }
  
  }
  