Added example for multiple data sources

This commit is contained in:
Umesh Awasthi
2018-10-28 15:15:54 -07:00
parent 2fc4b59b22
commit 7ba06c86f5
16 changed files with 782 additions and 0 deletions

View File

@@ -0,0 +1,12 @@
package com.javadevjournal;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MultipleDataSourcesWithSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MultipleDataSourcesWithSpringBootApplication.class, args);
}
}

View File

@@ -0,0 +1,58 @@
package com.javadevjournal.customer.config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
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.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "customerEntityManagerFactory",
transactionManagerRef = "customerTransactionManager",
basePackages = {"com.javadevjournal.customer.repo"}
)
public class CustomerConfig {
@Primary
@Bean(name = "customerDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource customerDataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "customerEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean
entityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier("customerDataSource") DataSource dataSource
) {
return builder
.dataSource(dataSource)
.packages("com.javadevjournal.customer.data")
.persistenceUnit("db1")
.build();
}
@Primary
@Bean(name = "customerTransactionManager")
public PlatformTransactionManager customerTransactionManager(
@Qualifier("customerEntityManagerFactory") EntityManagerFactory
customerEntityManagerFactory
) {
return new JpaTransactionManager(customerEntityManagerFactory);
}
}

View File

@@ -0,0 +1,46 @@
package com.javadevjournal.customer.data;
import javax.persistence.*;
@Entity
public class CustomerModel {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Column(unique = true,nullable = false)
private String email;
private String firstName;
private String lastName;
protected CustomerModel() {}
public CustomerModel(String email,String firstName, String lastName) {
this.email=email;
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return String.format(
"Customer[id=%d, firstName='%s', lastName='%s',email='%s']",
id, firstName, lastName,email);
}
public Integer getId() {
return id;
}
public String getEmail() {
return email;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}

View File

@@ -0,0 +1,9 @@
package com.javadevjournal.customer.repo;
import com.javadevjournal.customer.data.CustomerModel;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface CustomerRepository extends JpaRepository<CustomerModel,Integer> {
}

View File

@@ -0,0 +1,57 @@
package com.javadevjournal.product.config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
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.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "productEntityManagerFactory",
transactionManagerRef = "productTransactionManager",
basePackages = {"com.javadevjournal.product.repo"}
)
public class ProductConfig {
@Bean(name = "productDataSource")
@ConfigurationProperties(prefix = "db2.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "productEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean
barEntityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier("productDataSource") DataSource dataSource
) {
return
builder
.dataSource(dataSource)
.packages("com.javadevjournal.product.data")
.persistenceUnit("db2")
.build();
}
@Bean(name = "productTransactionManager")
public PlatformTransactionManager productTransactionManager(
@Qualifier("productEntityManagerFactory") EntityManagerFactory
productEntityManagerFactory
) {
return new JpaTransactionManager(productEntityManagerFactory);
}
}

View File

@@ -0,0 +1,48 @@
package com.javadevjournal.product.data;
import javax.persistence.*;
@Entity
public class ProductModel {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@Column(nullable = false)
private String code;
private String name;
private double price;
protected ProductModel() {}
public ProductModel(String code, String name, double price) {
this.code = code;
this.name = name;
this.price = price;
}
@Override
public String toString() {
return String.format(
"Product[id=%d, code='%s', name='%s', price='%s']",
id, code, name,price);
}
public int getId() {
return id;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
}

View File

@@ -0,0 +1,9 @@
package com.javadevjournal.product.repo;
import com.javadevjournal.product.data.ProductModel;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ProductRepository extends JpaRepository<ProductModel,Integer> {
}

View File

@@ -0,0 +1,14 @@
spring.jpa.generate-ddl=true
spring.jpa.database=default
#first db
spring.datasource.jdbc-url = jdbc:mysql://localhost:3306/db1
spring.datasource.username = root
spring.datasource.password =
spring.datasource.driverClassName = com.mysql.jdbc.Driver
#second db2 ...
db2.datasource.jdbc-url = jdbc:mysql://localhost:3306/db2
db2.datasource.username = root
db2.datasource.password =
db2.datasource.driverClassName = com.mysql.jdbc.Driver

View File

@@ -0,0 +1,38 @@
package com.javadevjournal;
import com.javadevjournal.customer.config.CustomerConfig;
import com.javadevjournal.customer.data.CustomerModel;
import com.javadevjournal.customer.repo.CustomerRepository;
import com.javadevjournal.product.config.ProductConfig;
import com.javadevjournal.product.data.ProductModel;
import com.javadevjournal.product.repo.ProductRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MultipleDataSourcesCustomerTests {
@Autowired
private CustomerRepository customerRepository;
@Test
@Transactional("customerTransactionManager")
public void create_check_customer() {
CustomerModel customer = new CustomerModel("user@javadevjournal.com","Robert","Hickle");
customer = customerRepository.save(customer);
assertNotNull(customerRepository.findById(customer.getId()));
assertEquals(customerRepository.findById(customer.getId()).get().getEmail() ,"user@javadevjournal.com");
}
}

View File

@@ -0,0 +1,33 @@
package com.javadevjournal;
import com.javadevjournal.customer.data.CustomerModel;
import com.javadevjournal.customer.repo.CustomerRepository;
import com.javadevjournal.product.data.ProductModel;
import com.javadevjournal.product.repo.ProductRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MultipleDataSourcesProductTests {
@Autowired
private ProductRepository productRepository;
@Test
@Transactional("productTransactionManager")
public void create_check_product() {
ProductModel product = new ProductModel("228781","Running Shoes", 20.0);
product = productRepository.save(product);
assertNotNull(productRepository.findById(product.getId()));
}
}