温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

spring boot springjpa如何支持多个数据源

发布时间:2021-07-21 14:24:13 来源:亿速云 阅读:199 作者:小新 栏目:编程语言

这篇文章将为大家详细讲解有关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。

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI