Skip to content

Instantly share code, notes, and snippets.

@mismatch
Created August 10, 2014 06:45
Show Gist options
  • Save mismatch/bc003479a09d6289e80f to your computer and use it in GitHub Desktop.
Save mismatch/bc003479a09d6289e80f to your computer and use it in GitHub Desktop.
Spring Boot. Multiple DB repositories configuration example
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.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
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 your.app.service.DbOneRepository;
import your.app.service.annotations.DbTwoRepository;
@Configuration
public class JpaRepositoriesConfig {
@Autowired
JpaProperties jpaProperties;
@Autowired @Qualifier("ds_one")
DataSource dsOne;
@Autowired @Qualifier("ds_two")
DataSource dsTwo;
@Bean(name = "emf_one")
LocalContainerEntityManagerFactoryBean entityManagerFactoryOne(
EntityManagerFactoryBuilder factory) {
return factory.dataSource(mainDataSource)
.packages("your.app.domain1")
.properties(getVendorProperties(mainDataSource)).build();
}
@Bean(name = "tx_manager_one")
PlatformTransactionManager transactionManagerOne(EntityManagerFactoryBuilder factory) {
return new JpaTransactionManager(entityManagerFactoryOne(factory).getObject());
}
@Bean(name = "emf_two")
LocalContainerEntityManagerFactoryBean entityManagerFactoryTwo(
EntityManagerFactoryBuilder factory) {
return factory.dataSource(dataSource)
.packages("your.app.domain2")
.properties(getVendorProperties(dataSource)).build();
}
@Bean(name = "tx_manager_two")
PlatformTransactionManager transactionManagerTwo(EntityManagerFactoryBuilder factory) {
return new JpaTransactionManager(entityManagerFactoryTwo(factory).getObject());
}
private Map<String, String> getVendorProperties(DataSource dataSource) {
return jpaProperties.getHibernateProperties(dataSource);
}
@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "emf_one", transactionManagerRef = "tx_manager_one", includeFilters =
@Filter(type = FilterType.ASSIGNABLE_TYPE, value = DbOneRepository.class))
static class DbOnepaRepositoriesConfig {}
@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "emf_two", transactionManagerRef = "tx_manager_two",
includeFilters = @Filter(DbTwoRepository.class))
static class DbTwoJpaRepositoriesConfig {}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment