연관관계의 주인은 연관관계에서 다쪽이니까 당연히 OrderItem 엔티티가 연관관계의 주인 아닌가요?
근데 왜 mappedBy 속성에 order 를 쓰나요? 이렇게 쓰면 연관관계의 주인이 Order 엔티티 아닌가요?
OrderItem Entity
@Entity
@Table(name="order_item")
@Getter @Setter
public class OrderItem {
...
// 단방향 매핑
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id")
private Order order;
...
}
Order Entity
@Entity
@Table(name="orders") // mysql 예약어 order
@Getter @Setter
public class Order {
...
// 양방향 매핑
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
List<OrderItem> orderItemList = new ArrayList<>();
...
}
Order - Item (다대다)
Order - OrderItem (일대다)
OrderItem - Item (다대일)
Order와 OrderItem 엔티티 양방향 매핑 시에는 Order(1쪽)에 OrderItem 배열을 추가하고 @OneToMany
어노테이션을 활용하여 일대다 양방향 매핑을 해야 한다.
양방향 매핑을 하는 경우, 연관관계의 주인을 지정해 주어야 한다.
연관관계의 주인이란?
객체의 양방향 관계인 경우 두 객체 중 하나로 외래 키를 관리해야한다.
- 두 객체 모두 외래 키를 관리할 수 있지만 하나를 정해야한다.
- 이 때 정해진 객체가 바로 연관관계의 주인
양방향 매핑 규칙
- 객체의 두 관계 중 하나를 연관관계의 주인으로 지정해야한다.
- 연관관계의 주인만이 외래 키를 관리할 수 있다. (등록, 수정)
- 주인이 아닌 쪽은 읽기만 가능하다. (조회)
- 주인이 아닌 객체에
mappedBy
속성으로 주인을 지정해야한다.
연관관계의 주인은 엔티티가 아니라 매핑된 객체 중에서 정해야한다.
즉, Order / OrderItem 엔티티 중 하나가 연관관계의 주인이 되는 것이 아니라
Order에 존재하는 OrderItem 객체 / OrderItem에 존재하는 Order 객체 중에서 정해야 한다.
mappedBy 의 의미
mappedBy 속성에 지정된 객체(변수명)에 의해 관리된다는 의미
= 지정된 객체가 연관관계의 주인
OrderItem 엔티티에 존재하는 “order” 객체가 외래키를 관리하는 연관관계의 주인이기 때문에 양방향 연관관계 어노테이션의 mappedBy 속성에 해당 객체의 변수명을 작성한 것이다.
// 양방향 매핑
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
List<OrderItem> orderItemList = new ArrayList<>();
요약
- 연관관계의 주인은 엔티티가 아닌 매핑된 객체 중에서 정해야 함
- 양방향 연관관계 매핑 시 다쪽 엔티티에 존재하는 객체가 연관관계의 주인
- OrderItem(다쪽)에 존재하는 Order 객체
“order”
가 연관관계의 주인이므로 mappedBy 속성에 작성해준 것이다.