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支持多个数据源的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!