JPA 객체의 단방향 연관관계 (N:1 @ManyToOne)

KMS·2022년 4월 4일
0

JPA Basics

목록 보기
5/20

Member 객체

@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "MEMBER_ID")
    private Long id;

    private String name;
    private String city;
    private String street;
    private String zipcode;

    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 객체

@Entity
@Table(name = "ORDERS")
public class Order {

    @Id
    @GeneratedValue() //Default strategy = auto
    @Column(name = "ORDER_ID")
    private Long id;


    @ManyToOne // N:1 관계; Member가 여러개의 주문을 할 수 있지만, 주문서는 하나의 Member랑만 연관 되어 있음
    @JoinColumn(name = "MEMBER_ID") // ... member m JOIN orders o ON m.MEMBER_ID = o.MEMBER_ID;
    private Member memberId; // memberId에 Member 객체 자체를 주입 함

    private LocalDateTime orderDate;

    @Enumerated(value = EnumType.STRING)
    private OrderStatus status;

    public Long getId() {
        return id;
    }

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

    public Member getMemberId() {
        return memberId;
    }

    public void setMemberId(Member memberId) {
        this.memberId = memberId;
    }

    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;
    }
}

MySQL로 생각해보면, Member 테이블에서의 id를 PK(Primary Key)로 갖고 있고, Orders 테이블에서는 Member 테이블의 MEMBER_ID를 참조하고 있는 FK(Foreign Key)를 갖고 있다.
이때, Orders가 Member를 단방향으로 참조하고 있으며, 여러개의 Orders가 하나의 Member를 참조하고 있기 때문에 Orders:Member는 N:1(다대일)의 연관관계이다.

@ManyToOne 애노테이션을 통해 다대일 관계를 알려주고, @JoinColumn을 통해 Orders가 Member에서 MEMBERID column을 FK로 참조하고 있음을 알려준다. SQL문으로 생각하면 SELECT *FROM member m JOIN orders o ON m.MEMBER_ID = o.MEMBER_ID를 생각해보면 된다. 또한, @JoinColumn 애노테이션으로 Member 객체 자체를 주입 받을 수 있다.

객체의 연관 관계 vs. 테이블의 연관 관계

사실, 테이블에서는 한쪽 테이블이 다른 테이블를 참조하고 있으면, JOIN을 통해 양방향 연관 관계가 맺힌다. 반면, JPA에서 객체의 연관 관계를 살펴보면, @ManyToOne 애노테이션을 붙혀준 Order의 memberId가 Member의 id를 참조하면 Order -> Member로 객체의 단방향 연관 관계를 갖지만, 반대로 Member -> Order의 연관 관계는 생기지 않는다. Member -> Order도 연관 관계를 갖도록 하는 것은 다음 포스팅에서 보겠습니다.

profile
Student at Sejong University Department of Software

0개의 댓글