@Entity
public class Item {
@Id
@GeneratedValue()
@Column(name = "ITEM_ID")
private Long id;
private String name;
private Integer price;
private Integer stockQuantity;
@ManyToMany(mappedBy = "itemList")
private List<Category> categoryList = new ArrayList<>();
}
@Entity
public class Category {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "PARENT_ID")
private Category parent;
/**
* 다대다(N:M) 관계는 사용 추천 X && 실무에서 사용 X
* 중간 테이블(category_item)을 이용해서 item과 category 간 다대다 연관관계 성립
* But, 실전에서는 중간 테이블에 연결할때 필요한 정보 외에 다른 정보들이 추가되는 경우가 많음
* 그렇기 때문에, 실무에서는 살용적이지 않음
*/
@ManyToMany
@JoinTable(name = "CATEGORY_ITEM",
joinColumns = @JoinColumn(name = "CATEGORY_ID"),
inverseJoinColumns = @JoinColumn(name = "ITEM_ID")
)
private List<Item> itemList = new ArrayList<>();
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
}
JPA에서 다대다(N:M) 연관관계를 성립시켜주기 위해서는, 연관관계를 맺어줄 두 테이블 사이에 중간 테이블을 하나 생성하고, 중간 테이블을 각각 1:N과 N:1 연관관계를 맺어주어야 한다.
중간 테이블에는 각 테이블을 참조할 외래키(FK)를 하나씩 저장하는데, 실무에서는 외래키들만 갖고 있기 어렵고, 여러 추가 정보들이 저장되어야하는 경우들이 많기 때문에 실무에서는 잘 사용되지 않는다.