springboot 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 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 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 {
	
	@Modifying
	@Query("update Banner m set m.name=?1 where m.id=?2")
	public void update(String bannerName, Long id);

}
5.注意:对@Primary修饰的LocalContainerEntityManagerFactoryBean可以不用指定TransactionManager,spring上下文自动使用默认的JpaTransactionManager,但是对于第二个或第三个等等必须指定TransactionManager。可以参考springboot官方文档中的相关章节。




 

你可能感兴趣的:(web开发问题,SpringBoot)