├── .gitignore ├── pom.xml └── src ├── main ├── java │ └── org │ │ └── example │ │ ├── AdminConfiguration.java │ │ ├── Application.java │ │ ├── LocalConfiguration.java │ │ ├── data │ │ ├── AbstractEntityRepository.java │ │ ├── admin │ │ │ └── CustomerRepository.java │ │ └── local │ │ │ └── ProductRepository.java │ │ └── domain │ │ ├── AbstractEntity.java │ │ ├── admin │ │ └── Customer.java │ │ └── local │ │ └── Product.java └── resources │ └── application.properties └── test └── java └── org └── example ├── ApplicationTests.java └── data ├── admin └── CustomerTests.java └── local └── ProductTests.java /.gitignore: -------------------------------------------------------------------------------- 1 | .classpath 2 | .project 3 | .idea/ 4 | .settings/ 5 | target/ 6 | *~ 7 | *.iml 8 | *.log 9 | *.tmp 10 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.example 7 | spring-boot-transaction 8 | 0.0.1-SNAPSHOT 9 | jar 10 | 11 | Spring Boot Transactions 12 | Multiple transaction managers with Spring Boot. 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.2.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | org.example.Application 24 | 1.8 25 | 26 | 27 | 28 | 29 | org.springframework.boot 30 | spring-boot-starter-data-jpa 31 | 32 | 33 | 34 | com.h2database 35 | h2 36 | runtime 37 | 38 | 39 | org.springframework.boot 40 | spring-boot-starter-test 41 | test 42 | 43 | 44 | 45 | 46 | 47 | 48 | org.springframework.boot 49 | spring-boot-maven-plugin 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /src/main/java/org/example/AdminConfiguration.java: -------------------------------------------------------------------------------- 1 | package org.example; 2 | 3 | import org.springframework.beans.factory.annotation.Qualifier; 4 | import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; 5 | import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilder; 6 | import org.springframework.boot.context.properties.ConfigurationProperties; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | import org.springframework.context.annotation.Primary; 10 | import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 11 | import org.springframework.orm.jpa.JpaTransactionManager; 12 | import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 13 | import org.springframework.transaction.annotation.EnableTransactionManagement; 14 | 15 | import javax.persistence.EntityManagerFactory; 16 | import javax.sql.DataSource; 17 | 18 | @Configuration 19 | @EnableJpaRepositories(basePackages = "org.example.data.admin", entityManagerFactoryRef = "adminEntityManagerFactory", transactionManagerRef = "adminTransactionManager") 20 | @EnableTransactionManagement 21 | public class AdminConfiguration 22 | { 23 | @Bean 24 | @ConfigurationProperties(prefix = "datasource.admin") 25 | @Primary 26 | public DataSource adminDataSource() 27 | { 28 | return DataSourceBuilder.create().build(); 29 | } 30 | 31 | @Bean 32 | @Primary 33 | public LocalContainerEntityManagerFactoryBean adminEntityManagerFactory(final EntityManagerFactoryBuilder builder) 34 | { 35 | return builder 36 | .dataSource(adminDataSource()) 37 | .packages("org.example.domain.admin") 38 | .persistenceUnit("adminPersistenceUnit") 39 | .build(); 40 | } 41 | 42 | @Bean 43 | @Primary 44 | public JpaTransactionManager adminTransactionManager(@Qualifier("adminEntityManagerFactory") final EntityManagerFactory factory) 45 | { 46 | return new JpaTransactionManager(factory); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/org/example/Application.java: -------------------------------------------------------------------------------- 1 | package org.example; 2 | 3 | import org.springframework.beans.factory.annotation.Qualifier; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; 7 | import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilder; 8 | import org.springframework.boot.context.properties.ConfigurationProperties; 9 | import org.springframework.context.annotation.Bean; 10 | import org.springframework.context.annotation.Primary; 11 | import org.springframework.orm.jpa.JpaTransactionManager; 12 | import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 13 | 14 | import javax.persistence.EntityManagerFactory; 15 | import javax.sql.DataSource; 16 | 17 | @SpringBootApplication 18 | public class Application 19 | { 20 | public static void main(String[] args) 21 | { 22 | SpringApplication.run(Application.class, args); 23 | } 24 | 25 | @Bean 26 | @ConfigurationProperties(prefix = "datasource.admin") 27 | @Primary 28 | public DataSource adminDataSource() 29 | { 30 | return DataSourceBuilder.create().build(); 31 | } 32 | 33 | @Bean 34 | @Primary 35 | public LocalContainerEntityManagerFactoryBean adminEntityManagerFactory(final EntityManagerFactoryBuilder builder) 36 | { 37 | return builder 38 | .dataSource(adminDataSource()) 39 | .packages("org.example.domain.admin") 40 | .persistenceUnit("adminPersistenceUnit") 41 | .build(); 42 | } 43 | 44 | @Bean 45 | @Primary 46 | public JpaTransactionManager adminTransactionManager(@Qualifier("adminEntityManagerFactory") final EntityManagerFactory factory) 47 | { 48 | return new JpaTransactionManager(factory); 49 | } 50 | 51 | @Bean 52 | @ConfigurationProperties(prefix = "datasource.local") 53 | public DataSource localDataSource() 54 | { 55 | return DataSourceBuilder.create().build(); 56 | } 57 | 58 | @Bean 59 | public LocalContainerEntityManagerFactoryBean localEntityManagerFactory(final EntityManagerFactoryBuilder builder) 60 | { 61 | return builder 62 | .dataSource(localDataSource()) 63 | .packages("org.example.domain.local") 64 | .persistenceUnit("localPersistenceUnit") 65 | .build(); 66 | } 67 | 68 | @Bean 69 | public JpaTransactionManager localTransactionManager(@Qualifier("localEntityManagerFactory") final EntityManagerFactory factory) 70 | { 71 | return new JpaTransactionManager(factory); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/org/example/LocalConfiguration.java: -------------------------------------------------------------------------------- 1 | package org.example; 2 | 3 | import org.springframework.beans.factory.annotation.Qualifier; 4 | import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; 5 | import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilder; 6 | import org.springframework.boot.context.properties.ConfigurationProperties; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 10 | import org.springframework.orm.jpa.JpaTransactionManager; 11 | import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 12 | import org.springframework.transaction.annotation.EnableTransactionManagement; 13 | 14 | import javax.persistence.EntityManagerFactory; 15 | import javax.sql.DataSource; 16 | 17 | @Configuration 18 | @EnableJpaRepositories(basePackages = "org.example.data.local", entityManagerFactoryRef = "localEntityManagerFactory", transactionManagerRef = "localTransactionManager") 19 | @EnableTransactionManagement 20 | public class LocalConfiguration 21 | { 22 | @Bean 23 | @ConfigurationProperties(prefix = "datasource.local") 24 | public DataSource localDataSource() 25 | { 26 | return DataSourceBuilder.create().build(); 27 | } 28 | 29 | @Bean 30 | public LocalContainerEntityManagerFactoryBean localEntityManagerFactory(final EntityManagerFactoryBuilder builder) 31 | { 32 | return builder 33 | .dataSource(localDataSource()) 34 | .packages("org.example.domain.local") 35 | .persistenceUnit("localPersistenceUnit") 36 | .build(); 37 | } 38 | 39 | @Bean 40 | public JpaTransactionManager localTransactionManager(@Qualifier("localEntityManagerFactory") final EntityManagerFactory factory) 41 | { 42 | return new JpaTransactionManager(factory); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/org/example/data/AbstractEntityRepository.java: -------------------------------------------------------------------------------- 1 | package org.example.data; 2 | 3 | import org.example.domain.AbstractEntity; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.data.repository.NoRepositoryBean; 6 | 7 | @NoRepositoryBean 8 | public interface AbstractEntityRepository extends JpaRepository 9 | { 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/org/example/data/admin/CustomerRepository.java: -------------------------------------------------------------------------------- 1 | package org.example.data.admin; 2 | 3 | import org.example.data.AbstractEntityRepository; 4 | import org.example.domain.admin.Customer; 5 | 6 | public interface CustomerRepository extends AbstractEntityRepository 7 | { 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/org/example/data/local/ProductRepository.java: -------------------------------------------------------------------------------- 1 | package org.example.data.local; 2 | 3 | import org.example.data.AbstractEntityRepository; 4 | import org.example.domain.local.Product; 5 | 6 | public interface ProductRepository extends AbstractEntityRepository 7 | { 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/org/example/domain/AbstractEntity.java: -------------------------------------------------------------------------------- 1 | package org.example.domain; 2 | 3 | import org.hibernate.annotations.Generated; 4 | import org.hibernate.annotations.GenerationTime; 5 | 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.GenerationType; 8 | import javax.persistence.Id; 9 | import javax.persistence.MappedSuperclass; 10 | 11 | @MappedSuperclass 12 | public abstract class AbstractEntity 13 | { 14 | @Generated(GenerationTime.INSERT) 15 | @GeneratedValue(strategy = GenerationType.AUTO) 16 | @Id 17 | private Long id; 18 | 19 | public Long getID() 20 | { 21 | return id; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/org/example/domain/admin/Customer.java: -------------------------------------------------------------------------------- 1 | package org.example.domain.admin; 2 | 3 | import org.example.domain.AbstractEntity; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.Entity; 7 | import javax.persistence.Table; 8 | 9 | @Entity 10 | @Table(name = "customer") 11 | public class Customer extends AbstractEntity 12 | { 13 | @Column(name = "name") 14 | private String name; 15 | 16 | public String getName() 17 | { 18 | return name; 19 | } 20 | 21 | public void setName(final String name) 22 | { 23 | this.name = name; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/org/example/domain/local/Product.java: -------------------------------------------------------------------------------- 1 | package org.example.domain.local; 2 | 3 | import org.example.domain.AbstractEntity; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.Entity; 7 | import javax.persistence.Table; 8 | 9 | @Entity 10 | @Table(name = "product") 11 | public class Product extends AbstractEntity 12 | { 13 | @Column(name = "name") 14 | private String name; 15 | 16 | public String getName() 17 | { 18 | return name; 19 | } 20 | 21 | public void setName(final String name) 22 | { 23 | this.name = name; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | datasource.admin.url=jdbc:h2:mem:admin 2 | datasource.admin.username=sa 3 | datasource.local.url=jdbc:h2:mem:local 4 | datasource.local.username=sa 5 | 6 | spring.jpa.database=H2 7 | spring.jpa.database-platform=org.hibernate.dialect.H2Dialect 8 | spring.jpa.generate-ddl=true 9 | -------------------------------------------------------------------------------- /src/test/java/org/example/ApplicationTests.java: -------------------------------------------------------------------------------- 1 | package org.example; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.boot.test.SpringApplicationConfiguration; 6 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 7 | 8 | @RunWith(SpringJUnit4ClassRunner.class) 9 | @SpringApplicationConfiguration(classes = Application.class) 10 | public class ApplicationTests 11 | { 12 | @Test 13 | public void contextLoads() 14 | { 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/test/java/org/example/data/admin/CustomerTests.java: -------------------------------------------------------------------------------- 1 | package org.example.data.admin; 2 | 3 | import org.example.Application; 4 | import org.example.domain.admin.Customer; 5 | import org.junit.Test; 6 | import org.junit.runner.RunWith; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.boot.test.SpringApplicationConfiguration; 9 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 10 | import org.springframework.util.Assert; 11 | 12 | @RunWith(SpringJUnit4ClassRunner.class) 13 | @SpringApplicationConfiguration(classes = Application.class) 14 | public class CustomerTests 15 | { 16 | @Autowired 17 | private CustomerRepository repository; 18 | 19 | @Test 20 | public void testCreate() 21 | { 22 | final Customer customer = new Customer(); 23 | customer.setName("John Doe"); 24 | 25 | Assert.notNull(repository.save(customer)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/test/java/org/example/data/local/ProductTests.java: -------------------------------------------------------------------------------- 1 | package org.example.data.local; 2 | 3 | import org.example.Application; 4 | import org.example.domain.local.Product; 5 | import org.junit.Test; 6 | import org.junit.runner.RunWith; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.boot.test.SpringApplicationConfiguration; 9 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 10 | import org.springframework.util.Assert; 11 | 12 | @RunWith(SpringJUnit4ClassRunner.class) 13 | @SpringApplicationConfiguration(classes = Application.class) 14 | public class ProductTests 15 | { 16 | @Autowired 17 | private ProductRepository repository; 18 | 19 | @Test 20 | public void testCreate() 21 | { 22 | final Product product = new Product(); 23 | product.setName("Apple iPad Air 2"); 24 | 25 | Assert.notNull(repository.save(product)); 26 | } 27 | } 28 | --------------------------------------------------------------------------------