成都网站建设设计

将想法与焦点和您一起共享

springbootspringjpa如何支持多个数据源

这篇文章将为大家详细讲解有关spring boot springjpa如何支持多个数据源,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

专注于为中小企业提供成都做网站、网站建设、外贸营销网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业大厂免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了1000+企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

1.SpringBoot的程序启动类

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.boot.builder.SpringApplicationBuilder; 
import org.springframework.boot.context.web.SpringBootServletInitializer; 
import org.springframework.context.annotation.ComponentScan; 
@ComponentScan 
@EnableAutoConfiguration 
//@EnableJpaRepositories(basePackages = "com.sonychina.backend.repository") 
public class Application extends SpringBootServletInitializer { 
  public static void main(String[] args) { 
    SpringApplication app = new SpringApplication(Application.class); 
    app.run(args); 
    //SpringApplication.run(Application.class, args); 
  } 
  @Override 
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
    return application.sources(Application.class); 
  } 
}

 2.双数据源配置类

import java.util.Map; 
import javax.sql.DataSource; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; 
import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilder; 
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; 
import org.springframework.boot.context.properties.ConfigurationProperties; 
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.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import com.test.entity.statistic.SysUser; 
import com.test.repository.system.SystemRepository; 
@Configuration 
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryPrimary", 
  basePackageClasses= {SystemRepository.class}) 
public class GlobalDataConfiguration { 
// @Autowired 
// private DBConfig dbConfig; 
  @Autowired 
  private JpaProperties jpaProperties; 
  @Bean(name="primaryDataSource") 
  @Primary 
  @ConfigurationProperties(prefix="datasource.primary") 
  public DataSource primaryDataSource() { 
    System.out.println("-------------------- primaryDataSource init ---------------------"); 
    return DataSourceBuilder.create().build(); 
  } 
  @Bean(name="secondaryDataSource") 
  @ConfigurationProperties(prefix="datasource.secondary") 
  public DataSource secondaryDataSource() { 
    System.out.println("-------------------- secondaryDataSource init ---------------------"); 
//   DataSourceBuilder factory = DataSourceBuilder  
//       .create(DBConfig.class.getClassLoader())  
//       .driverClassName(dbConfig.getDriver())  
//       .url(dbConfig.getUrl())  
//       .username(dbConfig.getUser())  
//       .password(dbConfig.getPassword());  
//   return factory.build(); 
    return DataSourceBuilder.create().build(); 
  } 
// @Bean(name = "entityManagerPrimary") 
// @Primary 
// public EntityManager entityManager(EntityManagerFactoryBuilder builder) { 
//   return customerEntityManagerFactory(builder).getObject().createEntityManager(); 
// } 
  @Bean(name="entityManagerFactoryPrimary") 
  @Primary 
  public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory(EntityManagerFactoryBuilder builder) { 
    return builder.dataSource(primaryDataSource()) 
          .properties(getVendorProperties(primaryDataSource())) 
          .packages(SysUser.class) 
          .persistenceUnit("system") 
          .build(); 
  } 
  private Map getVendorProperties(DataSource dataSource) { 
    return jpaProperties.getHibernateProperties(dataSource); 
  } 
}

3.第二个jpa实体管理器

import java.util.Map; 
import javax.sql.DataSource; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilder; 
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
import org.springframework.orm.jpa.JpaTransactionManager; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 
import com.test.entity.manage.Banner; 
import com.test.repository.manage.BannerRepository; 
@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactorySecondary", 
  transactionManagerRef="transactionManagerSecondary", 
  basePackageClasses= {BannerRepository.class}) 
public class SecondEMFBConfig { 
  @Autowired 
  private JpaProperties jpaProperties; 
  @Autowired@Qualifier("secondaryDataSource") 
  private DataSource dataSource; 
// @Bean(name = "entityManagerPrimary") 
// @Primary 
// public EntityManager entityManager(EntityManagerFactoryBuilder builder) { 
//   return customerEntityManagerFactory(builder).getObject().createEntityManager(); 
// } 
  @Bean(name="entityManagerFactorySecondary") 
  public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory(EntityManagerFactoryBuilder builder) { 
    return builder.dataSource(dataSource) 
          .properties(getVendorProperties(dataSource)) 
          .packages(Banner.class) 
          .persistenceUnit("customers") 
          .build(); 
  } 
  private Map getVendorProperties(DataSource dataSource) { 
    return jpaProperties.getHibernateProperties(dataSource); 
  } 
  @Bean(name = "transactionManagerSecondary") 
  PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) { 
    return new JpaTransactionManager(customerEntityManagerFactory(builder).getObject()); 
  } 
}

4.repository类举例

import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.data.jpa.repository.Modifying; 
import org.springframework.data.jpa.repository.Query; 
import com.test.entity.manage.Banner; 
public interface BannerRepository extends JpaRepository { 
  @Modifying 
  @Query("update Banner m set m.name=?1 where m.id=?2") 
  public void update(String bannerName, Long id); 
}

1.5.注意:对@Primary修饰的LocalContainerEntityManagerFactoryBean可以不用指定TransactionManager,spring上下文自动使用默认的JpaTransactionManager,但是对于第二个或第三个等等必须指定TransactionManager。

关于“spring boot springjpa如何支持多个数据源”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


网页标题:springbootspringjpa如何支持多个数据源
文章位置:http://chengdu.cdxwcx.cn/article/jcedjo.html