본문 바로가기

웹 기술 쌈싸먹기/JPA

[JPA] 연관관계 실습예제

연관관계 예제

 

1) ERD설계

👉 ERD 테이블 구조

 

2) Entity 구조

👉 entity 구조

 

3) 양방향 매핑 소스 예제

  • Member.class(회원)
@Entity
@Getter
@Setter
@Table(name = "member")
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<>();
}

 

  • Order.class(주문)
@Entity
@Getter
@Setter
@Table(name = "orders")
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; //주문상태 [ORDER, CANCEL]
}

 

  • OrderItem.class(주문정보)
@Entity
@Getter
@Setter
@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; //주문

    private int orderPrice; //주문 가격
    private int count; //주문 수량
}

 

  • OrderStatus.enum(주문상태)
public enum OrderStatus {
    ORDER, CANCEL
}

 

  • Delivery.class(배달정보)
@Entity
@Getter
@Setter
@Table(name = "delivery")
public class Delivery {

    @Id
    @GeneratedValue
    @Column(name = "delivery_id")
    private Long id;

    @OneToOne(mappedBy = "delivery", fetch = FetchType.LAZY)
    private Order order;

    @Embedded
    private Address address;

    @Enumerated(EnumType.STRING)
    private DeliveryStatus status; //ENUM [READY(준비), COMP(배송)]
}

 

  • DeliveryStatus.enum(배달상태)
public enum DeliveryStatus {
    READY, COMP
}

 

  • Address.class(주소정보)
@Embeddable
@Getter
public class Address {
    private String city;
    private String street;
    private String zipcode;

    protected Address() {

    }

    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }
}

 

  • Item.class(제품)
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)//상속받은 자식테이블과 merge해서 item 테이블을 싱글테이블로만든다.
@DiscriminatorColumn(name = "dtype")//DiscriminatorValue -> item을 상속받은 자식들과 매핑
@Getter
@Setter
@Table(name = "item")
public abstract class Item {

    @Id
    @GeneratedValue
    @Column(name = "item_id")
    private Long id;

    private String name;
    private int price;
    private int stockQuantity;

    @ManyToMany(mappedBy = "items")
    private List<Category> categories = new ArrayList<>();
}

 

  • Album.class(제품-Album)
@Entity
@DiscriminatorValue("A")
@Getter
@Setter
public class Album extends Item {
    private String artist;
    private String etc;
}

 

  • Book.class(제품-Book)
@Entity
@DiscriminatorValue("B")
@Getter
@Setter
public class Book extends Item {
    private String author;
    private String isbn;
}

 

  • Movie.class(제품-Movie)
@Entity
@DiscriminatorValue("M")
@Getter
@Setter
public class Movie extends Item {
    private String director;
    private String actor;
}

 

  • Category.class(카테고리)
@Entity
@Getter
@Setter
@Table(name = "category")
public class Category {
    @Id
    @GeneratedValue
    @Column(name = "category_id")
    private Long id;

    private String name;

    @ManyToMany // 실무에서는 @ManyToMany 사용금지!!! @OneToMany, @ManyToOne 관계로 바꾸기!!!
    @JoinTable(name = "category_item", //category 테이블과 item 테이블 사이의 중간테이블을 만든다.
            joinColumns = @JoinColumn(name = "category_id"),
            inverseJoinColumns = @JoinColumn(name = "item_id"))
    private List<Item> items = new ArrayList<>();

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

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

 

'웹 기술 쌈싸먹기 > JPA' 카테고리의 다른 글

[JPA] 벌크연산  (0) 2022.02.09
[JPA] Named 쿼리  (0) 2022.02.09
[JPA] 다형성 쿼리  (0) 2022.02.09
[JPA] 페치 조인(fetch join)  (0) 2022.02.09
[JPA] JPQL 경로표현식  (0) 2022.02.09