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
복사