spring boot springjpa 支持多个数据源的实例代码
1.SpringBoot的程序启动类
importorg.springframework.boot.SpringApplication; importorg.springframework.boot.autoconfigure.EnableAutoConfiguration; importorg.springframework.boot.builder.SpringApplicationBuilder; importorg.springframework.boot.context.web.SpringBootServletInitializer; importorg.springframework.context.annotation.ComponentScan; @ComponentScan @EnableAutoConfiguration //@EnableJpaRepositories(basePackages="com.sonychina.backend.repository") publicclassApplicationextendsSpringBootServletInitializer{ publicstaticvoidmain(String[]args){ SpringApplicationapp=newSpringApplication(Application.class); app.run(args); //SpringApplication.run(Application.class,args); } @Override protectedSpringApplicationBuilderconfigure(SpringApplicationBuilderapplication){ returnapplication.sources(Application.class); } }
2.双数据源配置类
importjava.util.Map; importjavax.sql.DataSource; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; importorg.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilder; importorg.springframework.boot.autoconfigure.orm.jpa.JpaProperties; importorg.springframework.boot.context.properties.ConfigurationProperties; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importorg.springframework.context.annotation.Primary; importorg.springframework.data.jpa.repository.config.EnableJpaRepositories; importorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; importcom.test.entity.statistic.SysUser; importcom.test.repository.system.SystemRepository; @Configuration @EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryPrimary", basePackageClasses={SystemRepository.class}) publicclassGlobalDataConfiguration{ //@Autowired //privateDBConfigdbConfig; @Autowired privateJpaPropertiesjpaProperties; @Bean(name="primaryDataSource") @Primary @ConfigurationProperties(prefix="datasource.primary") publicDataSourceprimaryDataSource(){ System.out.println("--------------------primaryDataSourceinit---------------------"); returnDataSourceBuilder.create().build(); } @Bean(name="secondaryDataSource") @ConfigurationProperties(prefix="datasource.secondary") publicDataSourcesecondaryDataSource(){ System.out.println("--------------------secondaryDataSourceinit---------------------"); //DataSourceBuilderfactory=DataSourceBuilder //.create(DBConfig.class.getClassLoader()) //.driverClassName(dbConfig.getDriver()) //.url(dbConfig.getUrl()) //.username(dbConfig.getUser()) //.password(dbConfig.getPassword()); //returnfactory.build(); returnDataSourceBuilder.create().build(); } //@Bean(name="entityManagerPrimary") //@Primary //publicEntityManagerentityManager(EntityManagerFactoryBuilderbuilder){ //returncustomerEntityManagerFactory(builder).getObject().createEntityManager(); //} @Bean(name="entityManagerFactoryPrimary") @Primary publicLocalContainerEntityManagerFactoryBeancustomerEntityManagerFactory(EntityManagerFactoryBuilderbuilder){ returnbuilder.dataSource(primaryDataSource()) .properties(getVendorProperties(primaryDataSource())) .packages(SysUser.class) .persistenceUnit("system") .build(); } privateMapgetVendorProperties(DataSourcedataSource){ returnjpaProperties.getHibernateProperties(dataSource); } }
3.第二个jpa实体管理器
importjava.util.Map; importjavax.sql.DataSource; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.beans.factory.annotation.Qualifier; importorg.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilder; importorg.springframework.boot.autoconfigure.orm.jpa.JpaProperties; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importorg.springframework.data.jpa.repository.config.EnableJpaRepositories; importorg.springframework.orm.jpa.JpaTransactionManager; importorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; importorg.springframework.transaction.PlatformTransactionManager; importorg.springframework.transaction.annotation.EnableTransactionManagement; importcom.test.entity.manage.Banner; importcom.test.repository.manage.BannerRepository; @Configuration @EnableTransactionManagement @EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactorySecondary", transactionManagerRef="transactionManagerSecondary", basePackageClasses={BannerRepository.class}) publicclassSecondEMFBConfig{ @Autowired privateJpaPropertiesjpaProperties; @Autowired@Qualifier("secondaryDataSource") privateDataSourcedataSource; //@Bean(name="entityManagerPrimary") //@Primary //publicEntityManagerentityManager(EntityManagerFactoryBuilderbuilder){ //returncustomerEntityManagerFactory(builder).getObject().createEntityManager(); //} @Bean(name="entityManagerFactorySecondary") publicLocalContainerEntityManagerFactoryBeancustomerEntityManagerFactory(EntityManagerFactoryBuilderbuilder){ returnbuilder.dataSource(dataSource) .properties(getVendorProperties(dataSource)) .packages(Banner.class) .persistenceUnit("customers") .build(); } privateMapgetVendorProperties(DataSourcedataSource){ returnjpaProperties.getHibernateProperties(dataSource); } @Bean(name="transactionManagerSecondary") PlatformTransactionManagertransactionManagerSecondary(EntityManagerFactoryBuilderbuilder){ returnnewJpaTransactionManager(customerEntityManagerFactory(builder).getObject()); } }
4.repository类举例
importorg.springframework.data.jpa.repository.JpaRepository; importorg.springframework.data.jpa.repository.Modifying; importorg.springframework.data.jpa.repository.Query; importcom.test.entity.manage.Banner; publicinterfaceBannerRepositoryextendsJpaRepository{ @Modifying @Query("updateBannermsetm.name=?1wherem.id=?2") publicvoidupdate(StringbannerName,Longid); }
1.5.注意:对@Primary修饰的LocalContainerEntityManagerFactoryBean可以不用指定TransactionManager,spring上下文自动使用默认的JpaTransactionManager,但是对于第二个或第三个等等必须指定TransactionManager。可以参考springboot官方文档中的相关章节。
总结
以上所述是小编给大家介绍的springbootspringjpa支持多个数据源的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!