Skip to content

Commit 3cc4fb9

Browse files
committed
fix jpa multiple db
1 parent fff145e commit 3cc4fb9

File tree

9 files changed

+81
-93
lines changed

9 files changed

+81
-93
lines changed

spring-jpa/pom.xml

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,6 @@
5252
<version>1.6.0.RELEASE</version>
5353
<scope>compile</scope>
5454
</dependency>
55-
56-
<!-- atomikos -->
57-
<dependency>
58-
<groupId>com.atomikos</groupId>
59-
<artifactId>transactions-jta</artifactId>
60-
<version>3.9.3</version>
61-
</dependency>
6255

6356
<!-- validation -->
6457

spring-jpa/src/main/java/org/baeldung/config/MultipleDBJPAConfig.java

Lines changed: 0 additions & 54 deletions
This file was deleted.

spring-jpa/src/main/java/org/baeldung/config/MyJtaPlatform.java

Lines changed: 0 additions & 22 deletions
This file was deleted.

spring-jpa/src/main/java/org/baeldung/config/ProductConfig.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@
1111
import org.springframework.core.env.Environment;
1212
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
1313
import org.springframework.jdbc.datasource.DriverManagerDataSource;
14+
import org.springframework.orm.jpa.JpaTransactionManager;
1415
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
1516
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
17+
import org.springframework.transaction.PlatformTransactionManager;
1618

1719
import com.google.common.base.Preconditions;
1820

1921
@Configuration
2022
@PropertySource({ "classpath:persistence-multiple-db.properties" })
21-
@EnableJpaRepositories(basePackages = "org.baeldung.persistence.multiple.dao.product", entityManagerFactoryRef = "productEntityManager", transactionManagerRef = "transactionManager")
23+
@EnableJpaRepositories(basePackages = "org.baeldung.persistence.multiple.dao.product", entityManagerFactoryRef = "productEntityManager", transactionManagerRef = "productTransactionManager")
2224
public class ProductConfig {
2325
@Autowired
2426
private Environment env;
@@ -36,8 +38,6 @@ public LocalContainerEntityManagerFactoryBean productEntityManagerFactory() {
3638
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
3739
em.setJpaVendorAdapter(vendorAdapter);
3840
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");
4141
properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
4242
properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
4343
em.setJpaPropertyMap(properties);
@@ -56,4 +56,11 @@ public DataSource productDataSource() {
5656
return dataSource;
5757
}
5858

59+
@Bean(name = "productTransactionManager")
60+
public PlatformTransactionManager transactionManager() {
61+
final JpaTransactionManager transactionManager = new JpaTransactionManager();
62+
transactionManager.setEntityManagerFactory(productEntityManagerFactory().getObject());
63+
return transactionManager;
64+
}
65+
5966
}

spring-jpa/src/main/java/org/baeldung/config/UserConfig.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,21 @@
77
import org.springframework.beans.factory.annotation.Autowired;
88
import org.springframework.context.annotation.Bean;
99
import org.springframework.context.annotation.Configuration;
10+
import org.springframework.context.annotation.Primary;
1011
import org.springframework.context.annotation.PropertySource;
1112
import org.springframework.core.env.Environment;
1213
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
1314
import org.springframework.jdbc.datasource.DriverManagerDataSource;
15+
import org.springframework.orm.jpa.JpaTransactionManager;
1416
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
1517
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
18+
import org.springframework.transaction.PlatformTransactionManager;
1619

1720
import com.google.common.base.Preconditions;
1821

1922
@Configuration
2023
@PropertySource({ "classpath:persistence-multiple-db.properties" })
21-
@EnableJpaRepositories(basePackages = "org.baeldung.persistence.multiple.dao.user", entityManagerFactoryRef = "userEntityManager", transactionManagerRef = "transactionManager")
24+
@EnableJpaRepositories(basePackages = "org.baeldung.persistence.multiple.dao.user", entityManagerFactoryRef = "userEntityManager", transactionManagerRef = "userTransactionManager")
2225
public class UserConfig {
2326
@Autowired
2427
private Environment env;
@@ -36,8 +39,6 @@ public LocalContainerEntityManagerFactoryBean userEntityManagerFactory() {
3639
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
3740
em.setJpaVendorAdapter(vendorAdapter);
3841
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");
4142
properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
4243
properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
4344
em.setJpaPropertyMap(properties);
@@ -56,4 +57,12 @@ public DataSource userDataSource() {
5657
return dataSource;
5758
}
5859

60+
@Primary
61+
@Bean(name = "userTransactionManager")
62+
public PlatformTransactionManager transactionManager() {
63+
final JpaTransactionManager transactionManager = new JpaTransactionManager();
64+
transactionManager.setEntityManagerFactory(userEntityManagerFactory().getObject());
65+
return transactionManager;
66+
}
67+
5968
}

spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/product/Product.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import javax.persistence.Entity;
44
import javax.persistence.Id;
5+
import javax.persistence.Table;
56

67
@Entity
8+
@Table(schema = "spring_jpa_product")
79
public class Product {
810

911
@Id
@@ -41,4 +43,10 @@ public void setPrice(final double price) {
4143
this.price = price;
4244
}
4345

46+
@Override
47+
public String toString() {
48+
final StringBuilder builder = new StringBuilder();
49+
builder.append("Product [name=").append(name).append(", id=").append(id).append("]");
50+
return builder.toString();
51+
}
4452
}

spring-jpa/src/main/java/org/baeldung/persistence/multiple/model/user/User.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package org.baeldung.persistence.multiple.model.user;
22

3+
import javax.persistence.Column;
34
import javax.persistence.Entity;
45
import javax.persistence.GeneratedValue;
56
import javax.persistence.GenerationType;
67
import javax.persistence.Id;
8+
import javax.persistence.Table;
79

810
@Entity
11+
@Table(schema = "spring_jpa_user")
912
public class User {
1013

1114
@Id
@@ -14,6 +17,7 @@ public class User {
1417

1518
private String name;
1619

20+
@Column(unique = true, nullable = false)
1721
private String email;
1822

1923
private int age;
@@ -54,4 +58,10 @@ public void setAge(final int age) {
5458
this.age = age;
5559
}
5660

61+
@Override
62+
public String toString() {
63+
final StringBuilder builder = new StringBuilder();
64+
builder.append("User [name=").append(name).append(", id=").append(id).append("]");
65+
return builder.toString();
66+
}
5767
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# jdbc.X
2+
jdbc.driverClassName=com.mysql.jdbc.Driver
3+
user.jdbc.url=jdbc:mysql://localhost:3306/spring_jpa_user?createDatabaseIfNotExist=true
4+
product.jdbc.url=jdbc:mysql://localhost:3306/spring_jpa_product?createDatabaseIfNotExist=true
5+
jdbc.user=tutorialuser
6+
jdbc.pass=tutorialmy5ql
7+
8+
# hibernate.X
9+
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
10+
hibernate.show_sql=false
11+
hibernate.hbm2ddl.auto=create-drop

spring-jpa/src/test/java/org/baeldung/persistence/service/JPAMultipleDBTest.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package org.baeldung.persistence.service;
22

33
import static org.junit.Assert.assertNotNull;
4+
import static org.junit.Assert.assertNull;
45

5-
import org.baeldung.config.MultipleDBJPAConfig;
66
import org.baeldung.config.ProductConfig;
77
import org.baeldung.config.UserConfig;
88
import org.baeldung.persistence.multiple.dao.product.ProductRepository;
@@ -12,15 +12,15 @@
1212
import org.junit.Test;
1313
import org.junit.runner.RunWith;
1414
import org.springframework.beans.factory.annotation.Autowired;
15+
import org.springframework.dao.DataIntegrityViolationException;
1516
import org.springframework.test.context.ContextConfiguration;
1617
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
1718
import org.springframework.test.context.transaction.TransactionConfiguration;
1819
import org.springframework.transaction.annotation.Transactional;
1920

2021
@RunWith(SpringJUnit4ClassRunner.class)
21-
@ContextConfiguration(classes = { MultipleDBJPAConfig.class, UserConfig.class, ProductConfig.class })
22-
@Transactional
23-
@TransactionConfiguration(transactionManager = "transactionManager")
22+
@ContextConfiguration(classes = { UserConfig.class, ProductConfig.class })
23+
@TransactionConfiguration
2424
public class JPAMultipleDBTest {
2525
@Autowired
2626
private UserRepository userRepository;
@@ -29,16 +29,41 @@ public class JPAMultipleDBTest {
2929
private ProductRepository productRepository;
3030

3131
@Test
32+
@Transactional("userTransactionManager")
3233
public void whenCreatingUser_thenCreated() {
3334
User user = new User();
3435
user.setName("John");
36+
user.setEmail("john@test.com");
3537
user.setAge(20);
3638
user = userRepository.save(user);
3739

3840
assertNotNull(userRepository.findOne(user.getId()));
3941
}
4042

4143
@Test
44+
@Transactional("userTransactionManager")
45+
public void whenCreatingUsersWithSameEmail_thenRollback() {
46+
User user1 = new User();
47+
user1.setName("John");
48+
user1.setEmail("john@test.com");
49+
user1.setAge(20);
50+
user1 = userRepository.save(user1);
51+
assertNotNull(userRepository.findOne(user1.getId()));
52+
53+
User user2 = new User();
54+
user2.setName("Tom");
55+
user2.setEmail("john@test.com");
56+
user2.setAge(10);
57+
try {
58+
user2 = userRepository.save(user2);
59+
} catch (final DataIntegrityViolationException e) {
60+
}
61+
62+
assertNull(userRepository.findOne(user2.getId()));
63+
}
64+
65+
@Test
66+
@Transactional("productTransactionManager")
4267
public void whenCreatingProduct_thenCreated() {
4368
Product product = new Product();
4469
product.setName("Book");
@@ -48,4 +73,5 @@ public void whenCreatingProduct_thenCreated() {
4873

4974
assertNotNull(productRepository.findOne(product.getId()));
5075
}
76+
5177
}

0 commit comments

Comments
 (0)