Skip to content

Commit d884dc4

Browse files
authored
[feature#36] support for transactions with mongoDB 4.0 (#37)
1 parent 9c87485 commit d884dc4

4 files changed

Lines changed: 220 additions & 9 deletions

File tree

pom.xml

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@
55

66
<groupId>io.github.kaiso.relmongo</groupId>
77
<artifactId>relmongo</artifactId>
8-
<version>2.3.0</version>
8+
<version>3.0.0</version>
99
<packaging>jar</packaging>
1010

1111
<name>relmongo</name>
1212
<url>https://kaiso.github.io/relmongo/</url>
1313
<description>Make use of relations in MongoDB</description>
14-
14+
1515
<properties>
1616
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1717
<maven.compiler.source>1.8</maven.compiler.source>
1818
<maven.compiler.target>1.8</maven.compiler.target>
1919
<maven.plugin.source.version>3.0.1</maven.plugin.source.version>
2020
<maven.plugin.javadoc.version>3.0.1</maven.plugin.javadoc.version>
21-
<spring.data.version>2.0.8.RELEASE</spring.data.version>
22-
<spring.version>5.0.6.RELEASE</spring.version>
23-
<mongo.driver.version>3.7.0</mongo.driver.version>
21+
<spring.data.version>2.1.3.RELEASE</spring.data.version>
22+
<spring.version>5.1.3.RELEASE</spring.version>
23+
<mongo.driver.version>3.9.1</mongo.driver.version>
2424
<junit.jupiter.version>5.2.0</junit.jupiter.version>
2525
<junit.platform.version>1.2.0</junit.platform.version>
2626
</properties>
@@ -90,6 +90,13 @@
9090
<scope>provided</scope>
9191
</dependency>
9292

93+
<dependency>
94+
<groupId>org.mongodb</groupId>
95+
<artifactId>mongo-java-driver</artifactId>
96+
<version>${mongo.driver.version}</version>
97+
</dependency>
98+
99+
93100
<!-- test dependencies -->
94101
<dependency>
95102
<groupId>org.junit.jupiter</groupId>
@@ -108,7 +115,7 @@
108115
<dependency>
109116
<groupId>de.flapdoodle.embed</groupId>
110117
<artifactId>de.flapdoodle.embed.mongo</artifactId>
111-
<version>2.0.1</version>
118+
<version>2.1.1</version>
112119
<scope>test</scope>
113120
</dependency>
114121
<dependency>
@@ -117,6 +124,32 @@
117124
<version>${spring.version}</version>
118125
<scope>test</scope>
119126
</dependency>
127+
128+
<dependency>
129+
<groupId>org.apache.logging.log4j</groupId>
130+
<artifactId>log4j-slf4j-impl</artifactId>
131+
<version>2.11.1</version>
132+
<scope>test</scope>
133+
</dependency>
134+
<dependency>
135+
<groupId>org.apache.logging.log4j</groupId>
136+
<artifactId>log4j-1.2-api</artifactId>
137+
<version>2.11.1</version>
138+
<scope>test</scope>
139+
</dependency>
140+
141+
<dependency>
142+
<groupId>org.apache.logging.log4j</groupId>
143+
<artifactId>log4j-api</artifactId>
144+
<version>2.11.1</version>
145+
<scope>test</scope>
146+
</dependency>
147+
<dependency>
148+
<groupId>org.apache.logging.log4j</groupId>
149+
<artifactId>log4j-core</artifactId>
150+
<version>2.11.1</version>
151+
<scope>test</scope>
152+
</dependency>
120153
</dependencies>
121154

122155

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package io.github.kaiso.relmongo.tests;
2+
3+
import io.github.kaiso.relmongo.data.model.Car;
4+
import io.github.kaiso.relmongo.data.model.DrivingLicense;
5+
import io.github.kaiso.relmongo.data.model.House;
6+
import io.github.kaiso.relmongo.data.model.Passport;
7+
import io.github.kaiso.relmongo.data.model.Person;
8+
import io.github.kaiso.relmongo.data.model.State;
9+
import io.github.kaiso.relmongo.data.repository.PersonRepository;
10+
import io.github.kaiso.relmongo.tests.common.AbstractBaseTest;
11+
12+
import org.junit.jupiter.api.Assertions;
13+
import org.junit.jupiter.api.BeforeEach;
14+
import org.junit.jupiter.api.Disabled;
15+
import org.junit.jupiter.api.Test;
16+
import org.springframework.beans.factory.annotation.Autowired;
17+
import org.springframework.context.annotation.Bean;
18+
import org.springframework.context.annotation.Configuration;
19+
import org.springframework.data.mongodb.MongoDbFactory;
20+
import org.springframework.data.mongodb.MongoTransactionException;
21+
import org.springframework.data.mongodb.MongoTransactionManager;
22+
import org.springframework.data.mongodb.core.MongoOperations;
23+
import org.springframework.stereotype.Service;
24+
import org.springframework.test.context.ContextConfiguration;
25+
import org.springframework.transaction.annotation.EnableTransactionManagement;
26+
import org.springframework.transaction.annotation.Propagation;
27+
import org.springframework.transaction.annotation.Transactional;
28+
29+
@ContextConfiguration(classes = { TransactionsTest.class })
30+
public class TransactionsTest extends AbstractBaseTest {
31+
32+
@Autowired
33+
private TransactionalBean transactionalBean;
34+
35+
@Service
36+
public static class TransactionalBean {
37+
38+
@Autowired
39+
private PersonRepository repository;
40+
41+
@Autowired
42+
private MongoOperations mongoOperations;
43+
44+
public void before() {
45+
46+
mongoOperations.dropCollection(DrivingLicense.class);
47+
mongoOperations.dropCollection(Passport.class);
48+
mongoOperations.dropCollection(Person.class);
49+
mongoOperations.dropCollection(House.class);
50+
mongoOperations.dropCollection(Car.class);
51+
mongoOperations.dropCollection(State.class);
52+
53+
// create collection
54+
mongoOperations.createCollection(Person.class);
55+
}
56+
57+
@Transactional(propagation = Propagation.REQUIRES_NEW)
58+
public void savePerson(Person person) {
59+
repository.save(person);
60+
}
61+
62+
@Transactional(propagation = Propagation.REQUIRES_NEW)
63+
public void savePersonAndDropCollection(Person person) {
64+
repository.save(person);
65+
repository.count();
66+
mongoOperations.dropCollection(Person.class);
67+
}
68+
69+
}
70+
71+
@Configuration
72+
@EnableTransactionManagement
73+
public static class TransactionConfig {
74+
75+
@Bean
76+
MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
77+
return new MongoTransactionManager(dbFactory);
78+
}
79+
80+
}
81+
82+
@BeforeEach
83+
public void beforeEach() {
84+
transactionalBean.before();
85+
}
86+
87+
@Test
88+
@Disabled("this test works only on replicaset environment")
89+
public void shouldSaveInTransaction() {
90+
91+
Person person = new Person();
92+
person.setName("Dave");
93+
person.setEmail("dave@mail.com");
94+
transactionalBean.savePerson(person);
95+
96+
}
97+
98+
@Test
99+
@Disabled("this test works only on replicaset environment")
100+
public void shouldSaveInTransaction_excepttion() {
101+
Assertions.assertThrows(MongoTransactionException.class, () -> {
102+
Person person = new Person();
103+
person.setName("Dave");
104+
person.setEmail("dave@mail.com");
105+
transactionalBean.savePersonAndDropCollection(person);
106+
});
107+
108+
}
109+
110+
}

src/test/java/io/github/kaiso/relmongo/tests/common/AbstractBaseTest.java

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.mongodb.Mongo;
44
import com.mongodb.MongoClient;
5+
import com.mongodb.ServerAddress;
56

67
import de.flapdoodle.embed.mongo.MongodExecutable;
78
import de.flapdoodle.embed.mongo.MongodProcess;
@@ -12,18 +13,49 @@
1213
import de.flapdoodle.embed.process.runtime.Network;
1314
import io.github.kaiso.relmongo.config.EnableRelMongo;
1415

16+
import org.apache.logging.log4j.core.config.ConfigurationSource;
17+
import org.apache.logging.log4j.core.config.Configurator;
18+
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
1519
import org.junit.jupiter.api.AfterAll;
1620
import org.junit.jupiter.api.BeforeAll;
1721
import org.junit.jupiter.api.extension.ExtendWith;
22+
import org.slf4j.Logger;
23+
import org.slf4j.LoggerFactory;
1824
import org.springframework.context.annotation.Bean;
25+
import org.springframework.context.annotation.ComponentScan;
26+
import org.springframework.data.mongodb.MongoDbFactory;
1927
import org.springframework.data.mongodb.core.MongoTemplate;
28+
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
2029
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
2130
import org.springframework.test.context.junit.jupiter.SpringExtension;
2231

32+
import java.io.File;
33+
import java.io.FileInputStream;
34+
import java.io.IOException;
35+
import java.util.Collections;
36+
2337
@EnableRelMongo
2438
@EnableMongoRepositories(basePackages = "io.github.kaiso.relmongo.data")
2539
@ExtendWith(SpringExtension.class)
40+
@ComponentScan(basePackages = { "io.github.kaiso.relmongo.tests" })
2641
public abstract class AbstractBaseTest {
42+
43+
private static Logger logger = LoggerFactory.getLogger(AbstractBaseTest.class);
44+
45+
static {
46+
ConfigurationSource configurationSource;
47+
try {
48+
configurationSource = new ConfigurationSource(
49+
new FileInputStream(new File(System.getProperty("user.dir") + "/src/test/resources/log4j2-test.yaml")));
50+
Configurator.initialize(ConfigurationBuilderFactory.newConfigurationBuilder().setConfigurationSource(configurationSource).build(true));
51+
logger.info("Logger initialized !");
52+
} catch (IOException e) {
53+
e.printStackTrace();
54+
}
55+
56+
57+
58+
}
2759

2860
/**
2961
* please store Starter or RuntimeConfig in a static final field
@@ -43,7 +75,10 @@ protected static void setUp() throws Exception {
4375
.net(new Net("localhost", 55777, Network.localhostIsIPv6())).build());
4476
_mongod = _mongodExe.start();
4577

46-
_mongo = new MongoClient("localhost", 55777);
78+
_mongo = new MongoClient(Collections.singletonList(new ServerAddress("127.0.0.1", 55777)));
79+
// _mongo = new MongoClient(Arrays.asList(new ServerAddress("127.0.0.1",
80+
// 30001),new ServerAddress("127.0.0.1", 30002),new ServerAddress("127.0.0.1",
81+
// 30003)));
4782
}
4883

4984
@AfterAll
@@ -58,9 +93,13 @@ public Mongo mongo() {
5893
return _mongo;
5994
}
6095

96+
public @Bean MongoDbFactory mongoDbFactory() {
97+
return new SimpleMongoDbFactory(_mongo, "test");
98+
}
99+
61100
@Bean
62-
public MongoTemplate mongoTemplate() throws Exception {
63-
return new MongoTemplate(_mongo, "test");
101+
public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory) throws Exception {
102+
return new MongoTemplate(mongoDbFactory);
64103
}
65104

66105
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
Configutation:
2+
name: Default
3+
4+
Properties:
5+
Property:
6+
name: log-path
7+
value: "logs"
8+
9+
Appenders:
10+
11+
Console:
12+
name: Console_Appender
13+
target: SYSTEM_OUT
14+
PatternLayout:
15+
pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"
16+
17+
Loggers:
18+
19+
Root:
20+
level: debug
21+
AppenderRef:
22+
- ref: Console_Appender
23+
24+
Logger:
25+
- name: thing.pack.appender
26+
level: debug
27+
AppenderRef:
28+
- ref: Console_Appender
29+
level: error

0 commit comments

Comments
 (0)