728x90
반응형
이전 실습에서 연관관계를 관리해보자
요구사항
- 글로벌 패치 전략 설정
모든 연관관계를 지연로딩으로 설정 (@ManyToOne
,@OneToOne
은 기본이 즉시로딩이므로 설정 변경) - 영속성 전이 설정
Order -> Delivery :CascadeType.ALL
설정
Order -> OrderItem :CasecadeType.ALL
설정
실습
글로벌 패치 전략, 영속성 전이 설정
- Order.java
@Entity
@Table(name = "ORDERS")
public class Order {
@Id @GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;
// 지연로딩으로 변경
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "MEMBER_ID")
private Member member;
// 지연로딩으로 변경, 영속성 전이 ALL 설정
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "DELIVERY_ID")
private Delivery delivery;
// 영속성 전이 ALL 설정
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
// 연관관계 편의 메소드
public void addOrderItem(OrderItem orderItem) {
orderItems.add(orderItem);
orderItem.setOrder(this);
}
// getter, setter
}
- OrderItem.java
@Entity
public class OrderItem {
@Id @GeneratedValue
@Column(name = "ORDER_ITEM_ID")
private Long id;
// 지연로딩으로 변경
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ORDER_ID")
private Order order;
// 지연로딩으로 변경
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ITEM_ID")
private Item item;
private int orderPrice;
private int count;
// getter, setter
}
- Delivery.java
@Entity
public class Delivery {
@Id @GeneratedValue
private Long id;
private String city;
private String street;
private String zipcode;
private DeliveryStatus status;
// 지연로딩 설정
@OneToOne(mappedBy = "delivery", fetch = FetchType.LAZY)
private Order order;
// getter, setter
}
Main
- JpaMain.java
// JpaMain.java
Delivery delivery = new Delivery();
Order order = new Order();
order.setDelivery(delivery);
// 영속성 전이 ALL 설정이기 때문에 Order 객체만 persist() 해도 Delivery 객체도 같이 persist() 처리된다.
em.persist(order);
em.flush();
em.clear();
Order findOrder = em.find(Order.class, order.getId());
// 지연로딩으로 프록시 객체
System.out.println("order.Delivery : " + findOrder.getDelivery().getClass());
System.out.println("before Proxy init");
// 강제 호출로 인한 프록시 객체 초기화
findOrder.getDelivery().getCity();
System.out.println("after Proxy init");
동작 결과
- 영속성 전이 ALL 설정으로 Order 영속 시 Delivery도 영속되는 것을 확인할 수 있다.
- 지연로딩 설정으로 Delivery 객체가 프록시 객체인 것을 확인할 수 있다.
- 프록시 객체 접근하여 초기화 시 DB 조회 실행을 확인할 수 있다.
728x90
반응형
'Dev > JPA' 카테고리의 다른 글
[JPA] 실습 - 값 타입 매핑 (0) | 2021.09.02 |
---|---|
[JPA] 값 타입 (0) | 2021.09.01 |
[JPA] 프록시와 연관관계 관리 (0) | 2021.08.27 |
[JPA] 실습 - 상속관계 매핑 (0) | 2021.08.25 |
[JPA] 고급 매핑 (0) | 2021.08.24 |
댓글