본문 바로가기
spring/JPA

[JPA] 다양한 연관관계 매핑

by H.초보개발자 2023. 12. 8.
반응형

이 글은 인프런의 김영한 강사님 자바 ORM 표준 JPA 프로그래밍-기본 편 강의 내용을 바탕으로 작성되었습니다.

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA 를 공부하고 책을 보며 어려웠던 내용을 위주로 먼저 보았습니다. 옆에서 1:1 과외해주는 것 같이 생생하고 이해 잘되는 설명, 예제(코드)가 너무 좋았습니다. 어느 것 하나 애매함없이 모두

www.inflearn.com

일단 전체적인 ERD를 보자면 다음과 같다. 이걸 JPA 객체화 시켜보자

일단 맴버 앤티티를 보면 다음과 같다.

@Entity
public class Member {
    @Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    private String name;
    private String city;
    private String street;
    private String zipCode;
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }
}

여기서 한명의 맴버는 order엔티티와 양방향 관계를 맺어줬다. orders는 테이블 상에는 없는 컬럼이지만 양방향으로 맺어줬기 때문에 추가를 해줬다. 양방향 상태의 주인은 Order객체의 member 변수에 지정을 해줬다. 다음은 Order 객체이다.

@Entity
@Table(name = "ORDERS")
public class Order {
    @Id
    @GeneratedValue
    @Column(name = "ORDER_ID")
    private Long id;
    @ManyToOne
    @JoinColumn(name="MEMBER_ID")
    private Member member;
    @OneToOne
    @JoinColumn(name = "DELIVERY_ID")
    private Delivery delivery;
    @OneToMany(mappedBy = "order")
    private List<OrderItem> orderItems = new ArrayList<>();
    private LocalDateTime orderDate;
    @Enumerated(EnumType.STRING)
    private OrderStatus status;

    public void addOrderItem(OrderItem orderItem){
        orderItems.add(orderItem);
        orderItem.setOrder(this);
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public Member getMember() {
        return member;
    }
    public void setMember(Member member) {
        this.member = member;
    }
    public LocalDateTime getOrderDate() {
        return orderDate;
    }
    public void setOrderDate(LocalDateTime orderDate) {
        this.orderDate = orderDate;
    }
    public OrderStatus getStatus() {
        return status;
    }
    public void setStatus(OrderStatus status) {
        this.status = status;
    }
}

Order 객체는 Delivery 객체와 1:1 매핑이 되어있다. 때문에 delivery객체와 OneToOne으로 지정을 해줬다. OneToOne매핑은 OneToMany와 같게 주인을 지정을 해야된다. 연관관계 주인은 일대일 매핑에는 각가의 스타일마다 차이가 있으나, 여기서는 Order객체에 지정을 해줬다. 다음은 Delivery 객체이다.

@Entity
public class Delivery {
    @Id
    @GeneratedValue
    private Long id;
    private String city;
    private String street;
    private String zipCode;
    private DeliveryStatus status;
    @OneToOne(mappedBy = "delivery")
    private Order order;
}

그리고 다음과 같이 양방향 관계에서 Order 객체에서 delivery에 지정한다고 (mappedBy="delivery")로 지정해 줬다.

@Entity
public class OrderItem {
    @Id
    @GeneratedValue
    @Column(name = "ORDER_ITEM_ID")
    private Long id;
    @ManyToOne
    @JoinColumn(name = "ORDER_ID")
    private Order order;
    @ManyToOne
    @JoinColumn(name="ITEM_ID")
    private Item item;
    private int orderPrice;
    private int cout;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public Order getOrder() {
        return order;
    }
    public void setOrder(Order order) {
        this.order = order;
    }
    public Item getItem() {
        return item;
    }
    public void setItem(Item item) {
        this.item = item;
    }
    public int getOrderPrice() {
        return orderPrice;
    }
    public void setOrderPrice(int orderPrice) {
        this.orderPrice = orderPrice;
    }
    public int getCout() {
        return cout;
    }
    public void setCout(int cout) {
        this.cout = cout;
    }
}

OrderItem은  특별한것은 없다. Order객체와 Item 객체와 다대일 매핑이 되어있다.

@Entity
public 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<>();
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public int getStockQuantity() {
        return stockQuantity;
    }

    public void setStockQuantity(int stockQuantity) {
        this.stockQuantity = stockQuantity;
    }
}

item 객체는 특이하게 Category객체와 다대다 로 매핑이 되어있다.

@Entity
public class Category {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Category parent;

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

    @ManyToMany
    @JoinTable(name = "CATEGORY_ITEM",
                joinColumns = @JoinColumn(name = "GATEGORY_ID"),
                inverseJoinColumns = @JoinColumn(name = "ITEM_ID"))
    private List<Item> items = new ArrayList<>();
}
반응형

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

[JPA] 프록시와 연관관계 관리  (1) 2023.12.11
[JPA] 고급매핑  (0) 2023.12.11
[JPA] 연관관계 매핑 기초  (2) 2023.12.07
[JPA] 엔티티 매핑  (1) 2023.11.09
[JPA] JPA 영속성 관리  (0) 2023.11.07