오봉이와 함께하는 개발 블로그

JPA - 실전 예제 5 - 연관관계 관리 본문

BE/JPA

JPA - 실전 예제 5 - 연관관계 관리

오봉봉이 2022. 6. 28. 22:59
728x90

이전 코드 참조

https://5bong2-develop.tistory.com/233

글로벌 페치 전략 설정

  • 모든 연관관계를 지연 로딩으로
    • @ManyToOne, @OneToOne은 기본이 즉시 로딩이므로 지연 로딩으로 변경

코드

@Entity
@Getter @Setter
public class Category extends BaseEntity{
    @Id @GeneratedValue
    @Column(name = "CATEGORY_ID")
    private Long id;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "PARENT_ID")
    private Category parent;

    @OneToMany(mappedBy = "parent")
    private List<Category> child = new ArrayList<>();

    @ManyToMany
    @JoinTable(name = "CATEGORY_ITEM", // 중간 테이블 매핑 작업
                joinColumns = @JoinColumn(name = "CATEGORY_ID"), // Category가 Join하는 컬럼 명시
                inverseJoinColumns = @JoinColumn(name = "ITEM_ID") // Item이 Join하는 컬럼 명시
    )
    private List<Item> items = new ArrayList<>();
}
@Entity
@Getter @Setter
public class Delivery extends BaseEntity{
    @Id @GeneratedValue
    @Column(name = "DELIVERY_ID")
    private Long id;

    private String city;
    private String street;
    private String zipcode;
    private DeliveryStatus status;

    @OneToOne(mappedBy = "delivery", fetch = FetchType.LAZY)
    private Order order;
}
@Entity
@Table(name = "ORDERS")
@Getter @Setter
public class Order extends BaseEntity{
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ORDER_ID")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "MEMBER_ID")
    private Member member;

    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;

    @OneToMany(mappedBy = "order")
    private List<OrderItem> orderItems = new ArrayList<>();

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "DELIVERY_ID")
    private Delivery delivery;
}
@Entity
public class OrderItem extends BaseEntity{
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    @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;
}

영속성 전이 설정

  • Order -> Delivery를 영속성 전이 ALL 설정
  • Order -> OrderItem을 영속성 전이 ALL 설정

코드

@Entity
@Table(name = "ORDERS")
@Getter @Setter
public class Order extends BaseEntity{
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ORDER_ID")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "MEMBER_ID")
    private Member member;

    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;

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

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "DELIVERY_ID")
    private Delivery delivery;
}
출처 : 인프런 김영한 지식공유자님의 스프링 부트와 JPA 실무 완전 정복 로드맵 강의
728x90

'BE > JPA' 카테고리의 다른 글

JPA - 임베디드 타입  (0) 2022.06.29
JPA - 기본값 타입  (0) 2022.06.29
JPA - 영속성 전이(CASCADE)와 고아 객체  (0) 2022.06.28
JPA - 즉시 로딩, 지연 로딩  (0) 2022.06.28
JPA - 프록시  (0) 2022.06.28
Comments