member.getOrder().getOrderItem().getItem())public class Member{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "team_id")
private Team team;
}
public class Team{
@OneToOne(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
- N의 역할인 Member은 연관관계의 주인이므로
@ManyToOne를 통해 관계를 명시하고@JoinColumn을 통해 어떤 외래키를 매핑하는지 지정해줄 수 있음- 1의 역할인 Team은 그저 매핑되는 객체이므로 주인인 Member 클래스의 team 변수에 매핑된다고 지정해줄 수 있음
객체는 컬렉션이 존재해서 다대다를 통해 각 연관관계를 표현 가능하지만, DB는 컬렉션 같은 도구가 없으므로 표현이 불가능함
즉 JPA에선 표현이 가능해서 @ManyToMany가 있지만 DB에선 표현이 불가능하니 JPA의 @JoinTable을 통해 중간 테이블을 생성하게 해줘야됨
해당 중간 테이블을 통해 일대다 다대일로 풀어낼 수 있음
public class Category{
@ManyToMany
@JoinTable(name = "category_item", joinColumns = @JoinColumn(name = "category_id"),inverseJoinColumns = @JoinColumn(name = "item_id"))
private List<Item> items = new ArrayList<>();
}
위와 같이 작성하면 category_id, item_id 외래키를 갖는 category_item이라는 중간 테이블이 생성됨
하지만 치명적인 단점은 중간 테이블에는 다른 칼럼을 넣을 수 없이 오직 지정된 외래키 필드만 가질 수 있음, 간단한 등록일/수정일 조차도 넣지 못함
즉 다대다일경우 처음부터 다대일, 일대다로 풀어야됨
public class Category{
/**
* 셀프 양방향 연관관계
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private Category parent;
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
}
셀프로 계층적으로 표현 가능