BAEL-4643: JPA CascadeType.REMOVE vs orphanRemoval

* Defines the Domain: ShipmentInfo, LineItem and OrderRequest entity
* Adds CascadeTypeRemoveIntegrationTest
* Adds OrphanRemovalIntegrationTest
This commit is contained in:
Emmanuel Yasa
2020-10-29 00:16:53 +08:00
parent 5116a45d1e
commit 06c800c526
6 changed files with 270 additions and 0 deletions
@@ -0,0 +1,72 @@
package com.baeldung.jpa.removal;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
public class CascadeTypeRemoveIntegrationTest {
private static EntityManagerFactory factory;
private static EntityManager entityManager;
@BeforeClass
public static void setup() {
factory = Persistence.createEntityManagerFactory("jpa-h2-removal");
entityManager = factory.createEntityManager();
}
@Test
public void whenOrderRequestIsDeleted_thenDeleteShipmentInfo() {
createOrderRequestWithShipmentInfo();
OrderRequest orderRequest = entityManager.find(OrderRequest.class, 1L);
entityManager.getTransaction().begin();
entityManager.remove(orderRequest);
entityManager.getTransaction().commit();
Assert.assertEquals(0, findAllOrderRequest().size());
Assert.assertEquals(0, findAllShipmentInfo().size());
}
private void createOrderRequestWithShipmentInfo() {
ShipmentInfo shipmentInfo = new ShipmentInfo("name");
OrderRequest orderRequest = new OrderRequest(shipmentInfo);
entityManager.getTransaction().begin();
entityManager.persist(orderRequest);
entityManager.getTransaction().commit();
Assert.assertEquals(1, findAllOrderRequest().size());
Assert.assertEquals(1, findAllShipmentInfo().size());
}
private List<OrderRequest> findAllOrderRequest() {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<OrderRequest> cq = cb.createQuery(OrderRequest.class);
Root<OrderRequest> root = cq.from(OrderRequest.class);
CriteriaQuery<OrderRequest> findAll = cq.select(root);
TypedQuery<OrderRequest> findAllQuery = entityManager.createQuery(findAll);
return findAllQuery.getResultList();
}
private List<ShipmentInfo> findAllShipmentInfo() {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<ShipmentInfo> cq = cb.createQuery(ShipmentInfo.class);
Root<ShipmentInfo> root = cq.from(ShipmentInfo.class);
CriteriaQuery<ShipmentInfo> findAll = cq.select(root);
TypedQuery<ShipmentInfo> findAllQuery = entityManager.createQuery(findAll);
return findAllQuery.getResultList();
}
}
@@ -0,0 +1,78 @@
package com.baeldung.jpa.removal;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
public class OrphanRemovalIntegrationTest {
private static EntityManagerFactory factory;
private static EntityManager entityManager;
@BeforeClass
public static void setup() {
factory = Persistence.createEntityManagerFactory("jpa-h2-removal");
entityManager = factory.createEntityManager();
}
@Test
public void whenLineItemIsRemovedFromOrderRequest_thenDeleteOrphanedLineItem() {
createOrderRequestWithLineItems();
OrderRequest orderRequest = entityManager.find(OrderRequest.class, 1L);
LineItem lineItem = entityManager.find(LineItem.class, 2L);
orderRequest.removeLineItem(lineItem);
entityManager.getTransaction().begin();
entityManager.merge(orderRequest);
entityManager.getTransaction().commit();
Assert.assertEquals(1, findAllOrderRequest().size());
Assert.assertEquals(2, findAllLineItem().size());
}
private void createOrderRequestWithLineItems() {
List<LineItem> lineItems = new ArrayList<>();
lineItems.add(new LineItem("line item 1"));
lineItems.add(new LineItem("line item 2"));
lineItems.add(new LineItem("line item 3"));
OrderRequest orderRequest = new OrderRequest(lineItems);
entityManager.getTransaction().begin();
entityManager.persist(orderRequest);
entityManager.getTransaction().commit();
Assert.assertEquals(1, findAllOrderRequest().size());
Assert.assertEquals(3, findAllLineItem().size());
}
private List<OrderRequest> findAllOrderRequest() {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<OrderRequest> cq = cb.createQuery(OrderRequest.class);
Root<OrderRequest> root = cq.from(OrderRequest.class);
CriteriaQuery<OrderRequest> findAll = cq.select(root);
TypedQuery<OrderRequest> findAllQuery = entityManager.createQuery(findAll);
return findAllQuery.getResultList();
}
private List<LineItem> findAllLineItem() {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<LineItem> cq = cb.createQuery(LineItem.class);
Root<LineItem> root = cq.from(LineItem.class);
CriteriaQuery<LineItem> findAll = cq.select(root);
TypedQuery<LineItem> findAllQuery = entityManager.createQuery(findAll);
return findAllQuery.getResultList();
}
}