Blog

[Spring][MiniProject 4일차]59 CascadeType.REMOVE 와 orphanRemoval = true 의 차이 스터디

Author
Summary
말로하다보면 두개는 너무 햇갈린다. 결국 삭제되고 똑같은듯 똑같지 않아 정리하게 되었다.
Category
Tags
Spring
Favorite
Memory Date
2023/09/19
Cross Reference Study
Related Media
Related Thought
Related Lessons
tag
날짜
작성자
진행상황
진행 전
태그구분
6 more properties
orphanRemoval = true
동작 방식:
장바구니의 아이템 목록에서 특정 아이템을 제거할 때, 해당 아이템은 데이터베이스에서도 삭제된다. 아래 코드에서 Cart 엔터티와 CartItem 엔터티 간의 관계는 일대다 관계이며, orphanRemoval = true로 설정되어있다.
@Entity public class Cart { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "cart", cascade = CascadeType.ALL, orphanRemoval = true) private List<CartItem> items = new ArrayList<>(); // 다른 필드와 메서드들 } @Entity public class CartItem { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne private Cart cart; // 다른 필드와 메서드들 }
Java
복사
코드에서 removeItemFromCart 메서드는 특정 장바구니(Cart)에서 아이템(CartItem)을 제거하고, entityManager.remove(item)을 호출하여 해당 아이템을 데이터베이스에서 삭제한다.
이때 orphanRemoval = true 설정에 따라 아이템이 데이터베이스에서도 삭제된다.
@Repository public class CartRepository { @Autowired private EntityManager entityManager; public void removeItemFromCart(Long cartId, Long itemId) { Cart cart = entityManager.find(Cart.class, cartId); if (cart != null) { List<CartItem> items = cart.getItems(); for (CartItem item : items) { if (item.getId().equals(itemId)) { items.remove(item); entityManager.remove(item); // 이 부분에서 해당 아이템이 데이터베이스에서 삭제됩니다. break; } } } } }
Java
복사
CascadeType.REMOVE
CascadeType.REMOVE동작 방식:
CascadeType.REMOVE는 부모 엔터티를 삭제할 때, 연관된 자식 엔터티들도 함께 삭제된다.
그러나 이 상황에서는 부모 엔터티를 삭제하는 것이 아니기 때문에, CascadeType.REMOVE만으로는 아이템의 삭제 로직을 구현할 수 없다. 아이템을 직접 삭제해야 한다.
이 예시에서는 "Order" 엔터티의 "items" 필드에 CascadeType.REMOVE를 설정하여 "Order"를 삭제할 때 관련된 "OrderItem"도 함께 삭제된다.
@Entity public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "order", cascade = CascadeType.REMOVE) private List<OrderItem> items = new ArrayList<>(); // 다른 필드와 메서드들 } @Entity public class OrderItem { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne private Order order; // 다른 필드와 메서드들 }
Java
복사
아래 코드에서는 EntityManager를 사용하여 "Order" 엔터티를 찾고 삭제하게 된다. 그러면 CascadeType.REMOVE 설정에 따라 연관된 "OrderItem"도 함께 삭제된다.
@Repository public class OrderRepository { @Autowired private EntityManager entityManager; public void deleteOrder(Long orderId) { Order order = entityManager.find(Order.class, orderId); if (order != null) { entityManager.remove(order); } } }
Java
복사