@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;
}
}
@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도 연관 관계를 갖도록 하는 것은 다음 포스팅에서 보겠습니다.