Skip to content

Commit dc95c48

Browse files
committed
Persistance context example
1 parent 994651a commit dc95c48

File tree

6 files changed

+249
-0
lines changed

6 files changed

+249
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.baeldung.persistancecontext;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.context.annotation.ComponentScan;
6+
7+
@SpringBootApplication
8+
@ComponentScan(basePackages="com.baeldung.persistancecontext")
9+
public class PersistentContextDemoApplication {
10+
public static void main(String[] args) {
11+
SpringApplication.run(PersistentContextDemoApplication.class, args);
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.baeldung.persistancecontext.controller;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.web.bind.annotation.PathVariable;
5+
import org.springframework.web.bind.annotation.RequestBody;
6+
import org.springframework.web.bind.annotation.RequestMapping;
7+
import org.springframework.web.bind.annotation.RequestMethod;
8+
import org.springframework.web.bind.annotation.RestController;
9+
10+
import com.baeldung.persistancecontext.entity.User;
11+
import com.baeldung.persistancecontext.service.ExtendedPersistenceContextUserService;
12+
import com.baeldung.persistancecontext.service.TransctionPersistenceContextUserService;
13+
14+
@RestController
15+
public class UserController{
16+
17+
@Autowired
18+
private TransctionPersistenceContextUserService userServiceTransctionPersistenceContext1;
19+
@Autowired
20+
private ExtendedPersistenceContextUserService userServiceExtendedPersistenceContext1;
21+
22+
@RequestMapping(value = "v1/user", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
23+
public User saveUserV1(@RequestBody User user) {
24+
return userServiceTransctionPersistenceContext1.insert(user);
25+
}
26+
27+
@RequestMapping(value = "v2/user", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
28+
public User saveUserV2(@RequestBody User user) {
29+
return userServiceExtendedPersistenceContext1.insert(user);
30+
}
31+
32+
@RequestMapping(value = "v3/user", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
33+
public User saveUserV3(@RequestBody User user) {
34+
return userServiceExtendedPersistenceContext1.insertWithManagedTransaction(user);
35+
}
36+
37+
@RequestMapping(value = "v4/user", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
38+
public User saveUserV4(@RequestBody User user) {
39+
return userServiceTransctionPersistenceContext1.insertWithoutTransaction(user);
40+
}
41+
42+
@RequestMapping(value = "v1/user/{id}", method = RequestMethod.GET, produces = "application/json")
43+
public User getUserV1(@PathVariable("id") Long id) {
44+
return userServiceTransctionPersistenceContext1.find(id);
45+
}
46+
47+
@RequestMapping(value = "v2/user/{id}", method = RequestMethod.GET, produces = "application/json")
48+
public User getUserV2(@PathVariable("id") Long id) {
49+
return userServiceExtendedPersistenceContext1.find(id);
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.baeldung.persistancecontext.entity;
2+
3+
import javax.persistence.Entity;
4+
import javax.persistence.Id;
5+
6+
@Entity
7+
public class User {
8+
9+
@Id
10+
private Long id;
11+
private String name;
12+
private String role;
13+
14+
public User() {
15+
16+
}
17+
18+
public User(Long id, String name, String role) {
19+
this.id = id;
20+
this.name = name;
21+
this.role = role;
22+
}
23+
24+
public Long getId() {
25+
return id;
26+
}
27+
28+
public String getName() {
29+
return name;
30+
}
31+
32+
public String getRole() {
33+
return role;
34+
}
35+
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.baeldung.persistancecontext.service;
2+
3+
import javax.persistence.EntityManager;
4+
import javax.persistence.PersistenceContext;
5+
import javax.persistence.PersistenceContextType;
6+
import javax.transaction.Transactional;
7+
8+
import org.springframework.stereotype.Component;
9+
10+
import com.baeldung.persistancecontext.entity.User;
11+
12+
@Component
13+
public class ExtendedPersistenceContextUserService {
14+
15+
@PersistenceContext(type = PersistenceContextType.EXTENDED)
16+
private EntityManager entityManager;
17+
18+
public EntityManager getEntityManager() {
19+
return entityManager;
20+
}
21+
22+
public User insert(User user) {
23+
entityManager.persist(user);
24+
return user;
25+
}
26+
27+
@Transactional
28+
public User insertWithManagedTransaction(User user) {
29+
entityManager.persist(user);
30+
return user;
31+
}
32+
33+
public User find(long id) {
34+
User user = entityManager.find(User.class, id);
35+
return user;
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.baeldung.persistancecontext.service;
2+
3+
4+
import javax.persistence.EntityManager;
5+
import javax.persistence.PersistenceContext;
6+
import javax.transaction.Transactional;
7+
8+
import org.springframework.stereotype.Component;
9+
10+
import com.baeldung.persistancecontext.entity.User;
11+
12+
@Component
13+
public class TransctionPersistenceContextUserService {
14+
15+
@PersistenceContext
16+
private EntityManager entityManager;
17+
18+
public EntityManager getEntityManager() {
19+
return entityManager;
20+
}
21+
22+
@Transactional
23+
public User insert(User user) {
24+
entityManager.persist(user);
25+
return user;
26+
}
27+
28+
public User insertWithoutTransaction(User user) {
29+
entityManager.persist(user);
30+
return user;
31+
}
32+
33+
public User find(long id) {
34+
return entityManager.find(User.class, id);
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.baeldung.persistancecontext;
2+
3+
import org.hamcrest.core.Is;
4+
import org.hamcrest.core.IsNull;
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
import org.junit.runner.RunWith;
8+
import org.springframework.boot.test.context.SpringBootTest;
9+
import org.springframework.boot.web.server.LocalServerPort;
10+
import org.springframework.test.context.junit4.SpringRunner;
11+
import org.springframework.web.client.HttpServerErrorException;
12+
import org.springframework.web.client.RestTemplate;
13+
14+
import com.baeldung.persistancecontext.entity.User;
15+
16+
import static org.junit.Assert.assertThat;
17+
18+
@RunWith(SpringRunner.class)
19+
@SpringBootTest(classes = PersistentContextDemoApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
20+
21+
public class PersistanceContextIntegrationTest {
22+
@LocalServerPort
23+
private int port;
24+
private RestTemplate restTemplate;
25+
26+
@Before
27+
public void setUp() {
28+
restTemplate = new RestTemplate();
29+
}
30+
31+
@Test
32+
public void testThatWhenUserSavedWithTransctionPersistenceContextThenUserShouldGetSavedInDB() {
33+
User user = new User(121L, "Devender", "admin");
34+
restTemplate.postForEntity(buildRequestUrl("v1/user/"), user, User.class);
35+
User userFromTransctionPersistenceContext = restTemplate.getForObject(buildRequestUrl("v1/user/121"), User.class);
36+
User userFromExtendedPersistenceContext = restTemplate.getForObject(buildRequestUrl("v2/user/121"), User.class);
37+
assertThat(userFromTransctionPersistenceContext, Is.is(IsNull.notNullValue()));
38+
assertThat(userFromExtendedPersistenceContext, Is.is(IsNull.notNullValue()));
39+
}
40+
41+
@Test(expected = HttpServerErrorException.class)
42+
public void testThatWhenUserSaveWithOutTransactionInPersistanceContextTypeTransactionThenShouldFailOnPersist() {
43+
User user = new User(122L, "Devender", "admin");
44+
restTemplate.postForEntity(buildRequestUrl("v4/user/"), user, User.class);
45+
}
46+
47+
@Test
48+
public void testThatWhenUserSavedWithExtendedPersistenceContextWithoutTransactionThenUserShouldGetBeCached() {
49+
User user = new User(123L, "Devender", "admin");
50+
restTemplate.postForEntity(buildRequestUrl("v2/user/"), user, User.class);
51+
User userFromExtendedPersistenceContext = restTemplate.getForObject(buildRequestUrl("v2/user/123"), User.class);
52+
User userFromTransctionPersistenceContext = restTemplate.getForObject(buildRequestUrl("v1/user/123"), User.class);
53+
assertThat(userFromExtendedPersistenceContext, Is.is(IsNull.notNullValue()));
54+
assertThat(userFromTransctionPersistenceContext, Is.is(IsNull.nullValue()));
55+
}
56+
57+
@Test
58+
public void testThatWhenUserSavedWithExtendedPersistenceContextWithTransactionThenUserShouldFlushCachedEntityIntoDB() {
59+
User user = new User(124L, "Devender", "admin");
60+
restTemplate.postForEntity(buildRequestUrl("v2/user/"), user, User.class);
61+
user = new User(125L, "Devender", "admin");
62+
restTemplate.postForEntity(buildRequestUrl("v3/user/"), user, User.class);
63+
User userFromExtendedPersistenceContextuser1 = restTemplate.getForObject(buildRequestUrl("v2/user/124"), User.class);
64+
User userFromExtendedPersistenceContextuser2 = restTemplate.getForObject(buildRequestUrl("v2/user/125"), User.class);
65+
User userFromTransctionPersistenceContextuser1 = restTemplate.getForObject(buildRequestUrl("v1/user/124"), User.class);
66+
User userFromTransctionPersistenceContextuser2 = restTemplate.getForObject(buildRequestUrl("v1/user/125"), User.class);
67+
assertThat(userFromExtendedPersistenceContextuser1, Is.is(IsNull.notNullValue()));
68+
assertThat(userFromExtendedPersistenceContextuser2, Is.is(IsNull.notNullValue()));
69+
assertThat(userFromTransctionPersistenceContextuser1, Is.is(IsNull.notNullValue()));
70+
assertThat(userFromTransctionPersistenceContextuser2, Is.is(IsNull.notNullValue()));
71+
}
72+
73+
private String buildRequestUrl(String path) {
74+
return "http://localhost:" + port + path;
75+
}
76+
}

0 commit comments

Comments
 (0)