공부하는 안경딸기
[JPA] 연관 관계 주인 본문
JPA 정식 공부한건 아니고 일단 실습 강의부터 듣고 있는데 내 DB 지식과 코딩 하면서 살짝 느껴지는 기운을 가지고 야매로 정리해봄
(나중에 제대로 배우면 그때 다시 정리할듯?)
연관 관계 주인의 위치?
1 : N 이나 N : 1에서 연관 관계가 만들어 지는데 이때 연관 관계 주인의 위치를 정해야 함.
외래키(FK)가 있는 곳을 연관 관계의 주인으로 정해야 함.
외래키(FK)는 주로 1 : N 관계에서 N의 개체에 넣어줌.
FK가 없는 곳을 연과 관계의 주인으로 정하게 되면 나중에 추가적으로 별도의 UPDATE 쿼리가 발생하는 등의 성능 문제가 있음.
연관 관계 주인 표시 예시 코드
@Entity
@Getter @Setter
public class OrderItem { //Many
@ManyToOne //하나의 주문이 여러 아이템 주문을 가짐 <-> 주문된 아이템은 하나의 주문을 가짐
@JoinColumn(name = "order_id") //FK
private Order order; //One
}
@Entity
@Table(name = "orders")
@Getter @Setter
public class Order { //One
//하나의 주문이 여러 아이템 주문을 가짐 <-> 주문된 아이템은 하나의 주문을 가짐
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems = new ArrayList<>(); //Many
}
주문 내역의 입장에서는 하나의 주문(Order)을 가짐 (N : 1)
주문 입장에서는 여러개의 주문 내역(OrderItem)을 가질 수 있음 (1 : N)
주문 내역 개체가 주인
@ManyToOne
N : 1의 관계 매핑 정보를 나타내는 어노테이션
주문 내역의 입장에서 주문을 보면 N : 1임
@JoinColumn
외래키(FK)를 매핑할 때 사용하는 어노테이션
위의 코드에서는 OrderItem이라는 테이블에 order_id라는 FK를 만드는데 사용
@OneToMany
1 : N의 관계 매핑 정보를 나타내는 어노테이션
주문의 입장에서 주문 내역을 보면 1 : N임
mappedBy - 연관 관계 주인 정하는 속성
주인 테이블은 mappedBy 속성을 사용하지 않음.
주인 테이블이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 정할 수 있음.
@ManyToMany
N : M 관계일 때 매핑 정보를 나타내는 어노테이션
그치만 DB에 다대다 관계를 만드는 것은 있을 수 없는 일...
만든다고 해도 중간에 관계 테이블 또 만들어야 하는거라 이 어노테이션은 가능하면 사용을 지양할 것
그리고 사용한다고 해도 겁나 복잡...
@Entity
@Getter @Setter
public class Category {
@ManyToMany
@JoinTable(name = "category_item",//다대다 관계에서의 중간 테이블 필수임!! 알쥐ㅣㅣㅣㅣㅣㅣㅣㅣㅣ/.?
joinColumns = @JoinColumn(name = "category_id"), //category table 쪽 column
inverseJoinColumns = @JoinColumn(name = "item_id") //item table 쪽 column
)
private List<Item> items = new ArrayList<>();
///////////////////////////////////////////////////////////////
@ManyToOne
@JoinColumn(name = "parent_id")
private Category parent;
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
}
대충 이런 느낌... ㅎㅎ
category_item이라는 중간 관계 테이블을 어노테이션으로 만들어서 그 안에 들어오는 속성이랑 반대쪽 개체로 가는 속성을 다 만들어 줘야함...