본문 바로가기
Dev/JPA

[JPA] 실습 - 연관관계 관리

by dev_jsk 2021. 8. 27.
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

댓글