spring boot springjpa 支持多个数据源的实例代码

 更新时间:2018年04月18日 16:00:24   作者:ba5189tsl  
这篇文章主要介绍了spring boot springjpa 支持多个数据源的实例代码,需要的朋友可以参考下

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<String, String> 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<String, String> 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<Banner, Long> { 
  @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。可以参考springboot官方文档中的相关章节。 

总结

以上所述是小编给大家介绍的spring boot springjpa 支持多个数据源的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 基于Comparator对象集合实现多个条件按照优先级的比较

    基于Comparator对象集合实现多个条件按照优先级的比较

    这篇文章主要介绍了基于Comparator对象集合实现多个条件按照优先级的比较,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java 高并发三:Java内存模型和线程安全详解

    Java 高并发三:Java内存模型和线程安全详解

    本文主要介绍Java高并发内存模型和线程安全的资料,这里整理详细的资料及1.原子性 2.有序性 3.可见性 4.Happen-Before 5.线程安全的概念,有需要的小伙伴可以参考下
    2016-09-09
  • Maven 的配置文件路径读取方法

    Maven 的配置文件路径读取方法

    这篇文章主要介绍了Maven 的配置文件路径读取方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    上次有朋友问我,java中的类可以是static吗?我给他肯定的回答是可以的,在java中我们可以有静态实例变量、静态方法、静态块。当然类也可以是静态的,下面小编整理了些关于java中的static class相关资料分享在脚本之家平台供大家参考
    2015-11-11
  • Mybatis plus枚举处理器的具体使用

    Mybatis plus枚举处理器的具体使用

    在开发中,数据库表中的字段很常见会使用枚举类型来表示一些固定的取值范围,本文主要介绍了Mybatis plus枚举处理器的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Java工具包之Lombok使用

    Java工具包之Lombok使用

    这篇文章主要介绍了Java工具包之Lombok使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • Spring Boot中使用Activiti的方法教程(二)

    Spring Boot中使用Activiti的方法教程(二)

    工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,下面这篇文章主要给大家介绍了关于Spring Boot中使用Activiti的相关资料,需要的朋友可以参考下
    2018-08-08
  • JAVA区间值判断[10,20)的实现

    JAVA区间值判断[10,20)的实现

    本文主要介绍了JAVA区间值判断[10,20)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • SpringCloud网关组件zuul实例解析

    SpringCloud网关组件zuul实例解析

    这篇文章主要介绍了SpringCloud网关组件zuul实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • mybatis-plus 批量插入示例代码

    mybatis-plus 批量插入示例代码

    正常我们使用mybatis-plus插入的时候,首先想到的是saveBatch方法,不过看了下打印出来的sql和底层代码,才发现它并不是真正的批量插入这篇文章主要介绍了mybatis-plus 批量插入示例,需要的朋友可以参考下
    2023-07-07

最新评论