FireDrago
[JPA] cascade는 언제 사용해야 할까? 본문
@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 속성을 통해 영속성 전이를 설정해주자.
'프로그래밍 > JPA' 카테고리의 다른 글
| [Spring Data JPA] 스프링 데이터 JPA 사용하기 (0) | 2024.04.23 |
|---|---|
| [JPA] @PersistenceContext 사용해야 하는 이유 (0) | 2024.04.08 |
| [JPA] JPQL 기본문법 2 (0) | 2024.04.06 |
| [JPA] JPQL 기본문법 1 (0) | 2024.04.04 |
| [JPA] 연관관계 관리 (0) | 2024.04.01 |
