├── .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 |
--------------------------------------------------------------------------------