Skip to content

Commit 425c681

Browse files
author
Eugen
committed
Merge pull request eugenp#124 from Doha2012/master
jpa multiple databases
2 parents d000971 + 15be913 commit 425c681

File tree

10 files changed

+368
-0
lines changed

10 files changed

+368
-0
lines changed

spring-jpa/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@
5353
<scope>compile</scope>
5454
</dependency>
5555

56+
<!-- atomikos -->
57+
<dependency>
58+
<groupId>com.atomikos</groupId>
59+
<artifactId>transactions-jta</artifactId>
60+
<version>3.9.3</version>
61+
</dependency>
5662

5763
<!-- validation -->
5864

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.baeldung.config;
2+
3+
import javax.transaction.TransactionManager;
4+
import javax.transaction.UserTransaction;
5+
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.ComponentScan;
9+
import org.springframework.context.annotation.Configuration;
10+
import org.springframework.context.annotation.DependsOn;
11+
import org.springframework.core.env.Environment;
12+
import org.springframework.transaction.PlatformTransactionManager;
13+
import org.springframework.transaction.annotation.EnableTransactionManagement;
14+
import org.springframework.transaction.jta.JtaTransactionManager;
15+
16+
import com.atomikos.icatch.jta.UserTransactionImp;
17+
import com.atomikos.icatch.jta.UserTransactionManager;
18+
19+
@Configuration
20+
@ComponentScan({ "org.baeldung.persistence.multiple" })
21+
@EnableTransactionManagement
22+
public class MultipleDBJPAConfig {
23+
@Autowired
24+
private Environment env;
25+
26+
public MultipleDBJPAConfig() {
27+
super();
28+
}
29+
30+
@Bean(name = "userTransaction")
31+
public UserTransaction userTransaction() {
32+
final UserTransactionImp userTransactionImp = new UserTransactionImp();
33+
return userTransactionImp;
34+
}
35+
36+
@Bean(name = "atomikosTransactionManager")
37+
public TransactionManager atomikosTransactionManager() {
38+
final UserTransactionManager userTransactionManager = new UserTransactionManager();
39+
MyJtaPlatform.transactionManager = userTransactionManager;
40+
41+
return userTransactionManager;
42+
}
43+
44+
@Bean(name = "transactionManager")
45+
@DependsOn({ "userTransaction", "atomikosTransactionManager" })
46+
public PlatformTransactionManager transactionManager() {
47+
final UserTransaction userTransaction = userTransaction();
48+
49+
MyJtaPlatform.transaction = userTransaction;
50+
51+
final TransactionManager atomikosTransactionManager = atomikosTransactionManager();
52+
return new JtaTransactionManager(userTransaction, atomikosTransactionManager);
53+
}
54+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.baeldung.config;
2+
3+
import javax.transaction.TransactionManager;
4+
import javax.transaction.UserTransaction;
5+
6+
import org.hibernate.engine.transaction.jta.platform.internal.AbstractJtaPlatform;
7+
8+
public class MyJtaPlatform extends AbstractJtaPlatform {
9+
10+
public static TransactionManager transactionManager;
11+
public static UserTransaction transaction;
12+
13+
@Override
14+
protected TransactionManager locateTransactionManager() {
15+
return transactionManager;
16+
}
17+
18+
@Override
19+
protected UserTransaction locateUserTransaction() {
20+
return transaction;
21+
}
22+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.baeldung.config;
2+
3+
import java.util.HashMap;
4+
5+
import javax.sql.DataSource;
6+
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
import org.springframework.context.annotation.PropertySource;
11+
import org.springframework.core.env.Environment;
12+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
13+
import org.springframework.jdbc.datasource.DriverManagerDataSource;
14+
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
15+
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
16+
17+
import com.google.common.base.Preconditions;
18+
19+
@Configuration
20+
@PropertySource({ "classpath:persistence-multiple-db.properties" })
21+
@EnableJpaRepositories(basePackages = "org.baeldung.persistence.multiple.dao.product", entityManagerFactoryRef = "productEntityManager", transactionManagerRef = "transactionManager")
22+
public class ProductConfig {
23+
@Autowired
24+
private Environment env;
25+
26+
public ProductConfig() {
27+
super();
28+
}
29+
30+
@Bean(name = "productEntityManager")
31+
public LocalContainerEntityManagerFactoryBean productEntityManagerFactory() {
32+
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
33+
em.setDataSource(productDataSource());
34+
em.setPackagesToScan(new String[] { "org.baeldung.persistence.multiple.model.product" });
35+
36+
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
37+
em.setJpaVendorAdapter(vendorAdapter);
38+
final HashMap<String, Object> properties = new HashMap<String, Object>();
39+
properties.put("hibernate.transaction.jta.platform", MyJtaPlatform.class.getName());
40+
properties.put("javax.persistence.transactionType", "JTA");
41+
properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
42+
properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
43+
em.setJpaPropertyMap(properties);
44+
45+
return em;
46+
}
47+
48+
@Bean
49+
public DataSource productDataSource() {
50+
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
51+
dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
52+
dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("product.jdbc.url")));
53+
dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
54+
dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));
55+
56+
return dataSource;
57+
}
58+
59+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.baeldung.config;
2+
3+
import java.util.HashMap;
4+
5+
import javax.sql.DataSource;
6+
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
import org.springframework.context.annotation.PropertySource;
11+
import org.springframework.core.env.Environment;
12+
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
13+
import org.springframework.jdbc.datasource.DriverManagerDataSource;
14+
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
15+
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
16+
17+
import com.google.common.base.Preconditions;
18+
19+
@Configuration
20+
@PropertySource({ "classpath:persistence-multiple-db.properties" })
21+
@EnableJpaRepositories(basePackages = "org.baeldung.persistence.multiple.dao.user", entityManagerFactoryRef = "userEntityManager", transactionManagerRef = "transactionManager")
22+
public class UserConfig {
23+
@Autowired
24+
private Environment env;
25+
26+
public UserConfig() {
27+
super();
28+
}
29+
30+
@Bean(name = "userEntityManager")
31+
public LocalContainerEntityManagerFactoryBean userEntityManagerFactory() {
32+
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
33+
em.setDataSource(userDataSource());
34+
em.setPackagesToScan(new String[] { "org.baeldung.persistence.multiple.model.user" });
35+
36+
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
37+
em.setJpaVendorAdapter(vendorAdapter);
38+
final HashMap<String, Object> properties = new HashMap<String, Object>();
39+
properties.put("hibernate.transaction.jta.platform", MyJtaPlatform.class.getName());
40+
properties.put("javax.persistence.transactionType", "JTA");
41+
properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
42+
properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
43+
em.setJpaPropertyMap(properties);
44+
45+
return em;
46+
}
47+
48+
@Bean
49+
public DataSource userDataSource() {
50+
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
51+
dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
52+
dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("user.jdbc.url")));
53+
dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
54+
dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));
55+
56+
return dataSource;
57+
}
58+
59+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.baeldung.persistence.multiple.dao.product;
2+
3+
import org.baeldung.persistence.multiple.model.product.Product;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface ProductRepository extends JpaRepository<Product, Integer> {
7+
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.baeldung.persistence.multiple.dao.user;
2+
3+
import org.baeldung.persistence.multiple.model.user.User;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface UserRepository extends JpaRepository<User, Integer> {
7+
8+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.baeldung.persistence.multiple.model.product;
2+
3+
import javax.persistence.Entity;
4+
import javax.persistence.Id;
5+
6+
@Entity
7+
public class Product {
8+
9+
@Id
10+
private int id;
11+
12+
private String name;
13+
14+
private double price;
15+
16+
public Product() {
17+
super();
18+
}
19+
20+
public int getId() {
21+
return id;
22+
}
23+
24+
public void setId(final int id) {
25+
this.id = id;
26+
}
27+
28+
public String getName() {
29+
return name;
30+
}
31+
32+
public void setName(final String name) {
33+
this.name = name;
34+
}
35+
36+
public double getPrice() {
37+
return price;
38+
}
39+
40+
public void setPrice(final double price) {
41+
this.price = price;
42+
}
43+
44+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.baeldung.persistence.multiple.model.user;
2+
3+
import javax.persistence.Entity;
4+
import javax.persistence.GeneratedValue;
5+
import javax.persistence.GenerationType;
6+
import javax.persistence.Id;
7+
8+
@Entity
9+
public class User {
10+
11+
@Id
12+
@GeneratedValue(strategy = GenerationType.AUTO)
13+
private int id;
14+
15+
private String name;
16+
17+
private String email;
18+
19+
private int age;
20+
21+
public User() {
22+
super();
23+
}
24+
25+
public int getId() {
26+
return id;
27+
}
28+
29+
public void setId(final int id) {
30+
this.id = id;
31+
}
32+
33+
public String getName() {
34+
return name;
35+
}
36+
37+
public void setName(final String name) {
38+
this.name = name;
39+
}
40+
41+
public String getEmail() {
42+
return email;
43+
}
44+
45+
public void setEmail(final String email) {
46+
this.email = email;
47+
}
48+
49+
public int getAge() {
50+
return age;
51+
}
52+
53+
public void setAge(final int age) {
54+
this.age = age;
55+
}
56+
57+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.baeldung.persistence.service;
2+
3+
import static org.junit.Assert.assertNotNull;
4+
5+
import org.baeldung.config.MultipleDBJPAConfig;
6+
import org.baeldung.config.ProductConfig;
7+
import org.baeldung.config.UserConfig;
8+
import org.baeldung.persistence.multiple.dao.product.ProductRepository;
9+
import org.baeldung.persistence.multiple.dao.user.UserRepository;
10+
import org.baeldung.persistence.multiple.model.product.Product;
11+
import org.baeldung.persistence.multiple.model.user.User;
12+
import org.junit.Test;
13+
import org.junit.runner.RunWith;
14+
import org.springframework.beans.factory.annotation.Autowired;
15+
import org.springframework.test.context.ContextConfiguration;
16+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
17+
import org.springframework.test.context.transaction.TransactionConfiguration;
18+
import org.springframework.transaction.annotation.Transactional;
19+
20+
@RunWith(SpringJUnit4ClassRunner.class)
21+
@ContextConfiguration(classes = { MultipleDBJPAConfig.class, UserConfig.class, ProductConfig.class })
22+
@Transactional
23+
@TransactionConfiguration(transactionManager = "transactionManager")
24+
public class JPAMultipleDBTest {
25+
@Autowired
26+
private UserRepository userRepository;
27+
28+
@Autowired
29+
private ProductRepository productRepository;
30+
31+
@Test
32+
public void whenCreateUser_thenCreated() {
33+
User user = new User();
34+
user.setName("John");
35+
user.setAge(20);
36+
user = userRepository.save(user);
37+
38+
assertNotNull(userRepository.findOne(user.getId()));
39+
}
40+
41+
@Test
42+
public void whenCreateProduct_thenCreated() {
43+
Product product = new Product();
44+
product.setName("Book");
45+
product.setId(2);
46+
product.setPrice(20);
47+
product = productRepository.save(product);
48+
49+
assertNotNull(productRepository.findOne(product.getId()));
50+
}
51+
}

0 commit comments

Comments
 (0)