這篇文章將為大家詳細講解有關spring boot springjpa如何支持多個數(shù)據(jù)源,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

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.雙數(shù)據(jù)源配置類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如何支持多個數(shù)據(jù)源”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
網(wǎng)站題目:springbootspringjpa如何支持多個數(shù)據(jù)源-創(chuàng)新互聯(lián)
文章起源:http://chinadenli.net/article8/cejiip.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供云服務器、響應式網(wǎng)站、自適應網(wǎng)站、App開發(fā)、營銷型網(wǎng)站建設、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容