글로벌 패치 전략 설정
- 글로벌 패치 전략을 즉시 로딩으로 설정하면 사용하지 않는 엔티티도 함께 조회되므로 모두 지연 로딩으로 설정
- @OneToMany, @ManyToMany는 기본으로 지연 로딩이므로 그냥 두고
@OneToOne, @ManyToOne의 fetch 속성을 지연 로딩으로 수정
// 주문
// 주문 엔티티에서 member와 delivery를 지연 로딩으로 설정
@Entity
@Table(name = "ORDERS")
public class Order extends BaseEntity {
@Id
@GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
@ManyToOne(fetch = FetchType.LAZY) // 지연 로딩
@JoinColumn(name = "MEMBER_ID")
private Member member; // 주문 회원
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) // 지연 로딩
@JoinColumn(name = "DELIVERY_ID")
private Delivery delivery; // 배송정보
...
}
// 주문상품
// 주문상품 엔티티에서 item과 order를 지연 로딩
@Entity
@Table(name = "ORDER_ITEM")
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; // 주문
...
}
영속성 전이 설정
- 엔티티를 영속 상태로 만들어서 데이터베이스에 저장할 때 연관된 엔티티도 모두 영속 상태여야 함
연관된 엔티티 중에 영속 상태가 아닌 엔티티가 있으면 플러시 시점에 예외가 발생 - 영속성 전이를 사용하면 연관된 엔티티를 편리하게 영속 상태로 만들 수 있음
- 주문과 배송, 주문과 주문상품의 연관관계에 영속성 전이를 사용
// 영속성 전이 설정
@Entity
@Table(name = "ORDERS")
public class Order extends BaseEntity {
...
// Order -> Delivery 관계인 delivery 필드에 cascade = CascadeType.ALL로 영속성 전이를 설정
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "DELIVERY_ID")
private Delivery delivery; // 배송정보
// Order -> OrderItem 관계인 orderItems 필드에 cascade = CascadeType.ALL로 영속성 전이를 설정
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<OrderItem>();
//==연관관계 메서드==//
public void addOrderItem(OrderItem orderItem) {
orderItems.add(orderItem);
orderItem.setOrder(this);
}
public void setDelivery(Delivery delivery) {
this.delivery = delivery;
delivery.setOrder(this);
}
- 영속성 전이를 사용하기 전후의 코드를 비교
// 영속성 전이를 사용하기 전
// 영속성 전이를 사용하기 전에는 연관된 엔티티들을 직접 영속 상태로 만들어야 함
Delivery delivery = new Delivery();
em.persist(delivery); // persist
OrderItem orderItem1 = new OrderItem();
OrderItem orderItem2 = new OrderItem();
em.persist(orderItem1); // persist
em.persist(orderItem2); // persist
Order order = new Order();
order.setDelivery(delivery);
order.addOrderItem(orderItem1);
order.addOrderItem(orderItem2);
em.persist(order); // persist
// 영속성 전이를 사용한 후
// Order만 영속 상태로 만들면 영속성 전이로 설정한 delivery, orderItems도 영속 상태가 됨
// PERSIST는 플러시 시점에 영속성 전이가 일어남
Delivery delivery = new Delivery();
OrderItem orderItem1 = new OrderItem();
OrderItem orderItem2 = new OrderItem();
Order order = new Order();
order.setDelivery(delivery);
order.addOrderItem(orderItem1);
order.addOrderItem(orderItem2);
em.persist(order); // delivery, orderItems 플러시 시점에 영속성 전이
'Java-Spring > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 값 타입 - 실전 예제 (0) | 2022.04.20 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 값 타입 (0) | 2022.04.19 |
[자바 ORM 표준 JPA 프로그래밍] 프록시와 연관관계 관리 (0) | 2022.04.14 |
[자바 ORM 표준 JPA 프로그래밍] 고급 매핑 - 실전 예제 (0) | 2022.04.12 |
[자바 ORM 표준 JPA 프로그래밍] 고급 매핑 (0) | 2022.04.12 |