Persistance context example

This commit is contained in:
devender.kumar
2019-10-30 17:44:40 +01:00
parent 994651a49f
commit dc95c488bb
6 changed files with 249 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
package com.baeldung.persistancecontext;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages="com.baeldung.persistancecontext")
public class PersistentContextDemoApplication {
public static void main(String[] args) {
SpringApplication.run(PersistentContextDemoApplication.class, args);
}
}

View File

@@ -0,0 +1,51 @@
package com.baeldung.persistancecontext.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.baeldung.persistancecontext.entity.User;
import com.baeldung.persistancecontext.service.ExtendedPersistenceContextUserService;
import com.baeldung.persistancecontext.service.TransctionPersistenceContextUserService;
@RestController
public class UserController{
@Autowired
private TransctionPersistenceContextUserService userServiceTransctionPersistenceContext1;
@Autowired
private ExtendedPersistenceContextUserService userServiceExtendedPersistenceContext1;
@RequestMapping(value = "v1/user", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public User saveUserV1(@RequestBody User user) {
return userServiceTransctionPersistenceContext1.insert(user);
}
@RequestMapping(value = "v2/user", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public User saveUserV2(@RequestBody User user) {
return userServiceExtendedPersistenceContext1.insert(user);
}
@RequestMapping(value = "v3/user", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public User saveUserV3(@RequestBody User user) {
return userServiceExtendedPersistenceContext1.insertWithManagedTransaction(user);
}
@RequestMapping(value = "v4/user", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public User saveUserV4(@RequestBody User user) {
return userServiceTransctionPersistenceContext1.insertWithoutTransaction(user);
}
@RequestMapping(value = "v1/user/{id}", method = RequestMethod.GET, produces = "application/json")
public User getUserV1(@PathVariable("id") Long id) {
return userServiceTransctionPersistenceContext1.find(id);
}
@RequestMapping(value = "v2/user/{id}", method = RequestMethod.GET, produces = "application/json")
public User getUserV2(@PathVariable("id") Long id) {
return userServiceExtendedPersistenceContext1.find(id);
}
}

View File

@@ -0,0 +1,36 @@
package com.baeldung.persistancecontext.entity;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private Long id;
private String name;
private String role;
public User() {
}
public User(Long id, String name, String role) {
this.id = id;
this.name = name;
this.role = role;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public String getRole() {
return role;
}
}

View File

@@ -0,0 +1,37 @@
package com.baeldung.persistancecontext.service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import javax.transaction.Transactional;
import org.springframework.stereotype.Component;
import com.baeldung.persistancecontext.entity.User;
@Component
public class ExtendedPersistenceContextUserService {
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;
public EntityManager getEntityManager() {
return entityManager;
}
public User insert(User user) {
entityManager.persist(user);
return user;
}
@Transactional
public User insertWithManagedTransaction(User user) {
entityManager.persist(user);
return user;
}
public User find(long id) {
User user = entityManager.find(User.class, id);
return user;
}
}

View File

@@ -0,0 +1,36 @@
package com.baeldung.persistancecontext.service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;
import org.springframework.stereotype.Component;
import com.baeldung.persistancecontext.entity.User;
@Component
public class TransctionPersistenceContextUserService {
@PersistenceContext
private EntityManager entityManager;
public EntityManager getEntityManager() {
return entityManager;
}
@Transactional
public User insert(User user) {
entityManager.persist(user);
return user;
}
public User insertWithoutTransaction(User user) {
entityManager.persist(user);
return user;
}
public User find(long id) {
return entityManager.find(User.class, id);
}
}

View File

@@ -0,0 +1,76 @@
package com.baeldung.persistancecontext;
import org.hamcrest.core.Is;
import org.hamcrest.core.IsNull;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.RestTemplate;
import com.baeldung.persistancecontext.entity.User;
import static org.junit.Assert.assertThat;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = PersistentContextDemoApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class PersistanceContextIntegrationTest {
@LocalServerPort
private int port;
private RestTemplate restTemplate;
@Before
public void setUp() {
restTemplate = new RestTemplate();
}
@Test
public void testThatWhenUserSavedWithTransctionPersistenceContextThenUserShouldGetSavedInDB() {
User user = new User(121L, "Devender", "admin");
restTemplate.postForEntity(buildRequestUrl("v1/user/"), user, User.class);
User userFromTransctionPersistenceContext = restTemplate.getForObject(buildRequestUrl("v1/user/121"), User.class);
User userFromExtendedPersistenceContext = restTemplate.getForObject(buildRequestUrl("v2/user/121"), User.class);
assertThat(userFromTransctionPersistenceContext, Is.is(IsNull.notNullValue()));
assertThat(userFromExtendedPersistenceContext, Is.is(IsNull.notNullValue()));
}
@Test(expected = HttpServerErrorException.class)
public void testThatWhenUserSaveWithOutTransactionInPersistanceContextTypeTransactionThenShouldFailOnPersist() {
User user = new User(122L, "Devender", "admin");
restTemplate.postForEntity(buildRequestUrl("v4/user/"), user, User.class);
}
@Test
public void testThatWhenUserSavedWithExtendedPersistenceContextWithoutTransactionThenUserShouldGetBeCached() {
User user = new User(123L, "Devender", "admin");
restTemplate.postForEntity(buildRequestUrl("v2/user/"), user, User.class);
User userFromExtendedPersistenceContext = restTemplate.getForObject(buildRequestUrl("v2/user/123"), User.class);
User userFromTransctionPersistenceContext = restTemplate.getForObject(buildRequestUrl("v1/user/123"), User.class);
assertThat(userFromExtendedPersistenceContext, Is.is(IsNull.notNullValue()));
assertThat(userFromTransctionPersistenceContext, Is.is(IsNull.nullValue()));
}
@Test
public void testThatWhenUserSavedWithExtendedPersistenceContextWithTransactionThenUserShouldFlushCachedEntityIntoDB() {
User user = new User(124L, "Devender", "admin");
restTemplate.postForEntity(buildRequestUrl("v2/user/"), user, User.class);
user = new User(125L, "Devender", "admin");
restTemplate.postForEntity(buildRequestUrl("v3/user/"), user, User.class);
User userFromExtendedPersistenceContextuser1 = restTemplate.getForObject(buildRequestUrl("v2/user/124"), User.class);
User userFromExtendedPersistenceContextuser2 = restTemplate.getForObject(buildRequestUrl("v2/user/125"), User.class);
User userFromTransctionPersistenceContextuser1 = restTemplate.getForObject(buildRequestUrl("v1/user/124"), User.class);
User userFromTransctionPersistenceContextuser2 = restTemplate.getForObject(buildRequestUrl("v1/user/125"), User.class);
assertThat(userFromExtendedPersistenceContextuser1, Is.is(IsNull.notNullValue()));
assertThat(userFromExtendedPersistenceContextuser2, Is.is(IsNull.notNullValue()));
assertThat(userFromTransctionPersistenceContextuser1, Is.is(IsNull.notNullValue()));
assertThat(userFromTransctionPersistenceContextuser2, Is.is(IsNull.notNullValue()));
}
private String buildRequestUrl(String path) {
return "http://localhost:" + port + path;
}
}