FireDrago

[JPA] cascade는 언제 사용해야 할까? 본문

프로그래밍/JPA

[JPA] cascade는 언제 사용해야 할까?

화이용 2024. 4. 9. 11:24
@Entity
@Getter
@Setter
public class Member {

    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private Long id;

    private String name;

    @Embedded
    private Address address;

    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}
@Entity
@Table(name = "orders")
@Getter
@Setter
public class Order {

    @Id
    @GeneratedValue
    @Column(name = "order_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;
	
    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "delivery_id")
    private Delivery delivery;

    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;
}
@Entity
@Table(name = "order_item")
@Getter
@Setter
public class OrderItem {

    @Id
    @GeneratedValue
    @Column(name = "order_item_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "item_id")
    private Item item;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id")
    private Order order;

    private int orderPrice;
    private int count;
}

 

세 객체는 JPA 엔티티 Member , Order , OrderItem 객체다.

 

Member 는 Orders 라는 @OneToMany 관계를 맺고 있으면서도 cascade 속성이 없다.

반면 Order 객체의 OrderItems 역시 @OneToMany 관계를 맺고 있는데, cascade = CascadeType.ALL 설정이 되어있다.

@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
    
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();

 

언제 cascade 속성을 사용해야 할까? 엔티티의 생성시기를 잘 살펴야한다.

Member는 Order 와 함께 생성되는가? 아니다 멤버 엔티티는 회원가입시, 주문 엔티티는 주문시 생성된다.

반면 Order 와 OrderItem 은 주문시 함께 생성된다. 이때 cascade 속성을 통해 영속성 전이를 설정해주자.