흔한 경우는 아니겠지만 가끔 필요할 때가 있다.
예를 들어 카테고리는 다른 카테고리를 가리키면서 계층을 형성한다. 그런데 계층마다 이름만 다른 똑같이 생긴 카테고리 클래스를 생성해서 관계를 맺는 것은 비효율적이다. 이런 경우 같은 카테고리 클래스끼리 다대일 양방향 관계를 맺는 것이 편리하다.
아래는 카테고리 클래스로 다대일 양방향 관계를 맺은 모습이다.
@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
String name;
@OneToMany(mappedBy = "parentCategory")
List<Category> childCategories;
@ManyToOne
Category parentCategory;
}
만약 카테고리끼리 관계를 맺는다면 아래와 같은 관계가 될 것이다. 트리를 만든다고 생각해도 좋을 것 같다.
아래 코드로 부모 카테고리 하나와 자식 카테고리 세 개를 저장해보았다.
@Test
void test() {
Category parentCategory = categoryRepository.save(
Category.builder()
.name("치킨")
.build()
);
categoryRepository.save(
Category.builder()
.name("네네치킨")
.parentCategory(parentCategory)
.build()
);
categoryRepository.save(
Category.builder()
.name("BBQ")
.parentCategory(parentCategory)
.build()
);
categoryRepository.save(
Category.builder()
.name("굽네치킨")
.parentCategory(parentCategory)
.build()
);
}
생성된 테이블의 모습
댓글과 대댓글 관계에도 이용할 수 있을 것이라고 생각된다.
'JPA' 카테고리의 다른 글
JPA 상속관계 매핑 (0) | 2022.09.01 |
---|---|
OneToOne 정리 (0) | 2022.08.29 |
JPA fetch join 대상의 별칭 사용과 주의사항 (0) | 2022.08.16 |
fetch join과 paging 시 OOM 문제 (OneToOne은 괜찮지) (0) | 2022.08.10 |
JPA에서 발생할 수 있는 문제들과 해결방법 정리 (N + 1, 무작위 JOIN..) (0) | 2022.08.09 |