ggoggo
[JPA] 다대다관계 본문

다대다(M:N) 관계란
두 개의 테이블이 서로의 행에 대해서 여러개로 연관되어 있는 상태를 다대다(M:N)관계라 한다.
예를 들어 하나의 상품이 여러 구성성분들로 이루어져 있고,
한 구성 성분들은 여러 상품들에 구성되어지는 관계를 말한다.
구현은?
객체는 컬렉션을 사용해서 객체 2개로 다대다 관계가 가능하다.

위의 예시처럼 JPA의 @ManyToMany 어노테이션을 사용해 객체의 다대다 관계를 구현하고 테이블 상에서 연결 테이블이 존재하면 된다. 하지만 이 방식을 지양되어져야 한다.
- 조인 테이블 자체에 주문시간, 수량 같은 추가 정보를 넣을 수 없다.
- 개발 상에서 연결 테이블이 엔티티로 보이지 않기 때문에 예상하지 못하는 쿼리들이 나간다.
따라서 연결 테이블을 엔티티로 승격 시켜야 한다.
@ManyToMany를 @ManyToOne, @OneToMany로 풀어 표현하면 유연한 개발이 가능한 다대다 매핑이 완성된다.
실제 프로젝트에 적용한 내용이다.

Ingredient
@Entity
public class Ingredient {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String description;
@OneToMany(mappedBy = "ingredient")
private List<ProductIngredient> products = new ArrayList<>();
}
ProductIngredient
@Entity
public class ProductIngredient {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "product_id")
private Product product;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ingredient_id")
private Ingredient ingredient;
}
Product
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
...
@OneToMany(mappedBy = "product")
private List<ProductIngredient> ingredients = new ArrayList<>();
}
'Spring > JPA' 카테고리의 다른 글
[SpringDataJPA] SpringDataJPA란? (0) | 2023.11.27 |
---|---|
[JPA] 연관관계 매핑 (0) | 2023.11.26 |