JPA
같은 클래스와 다대일 양방향 관계 맺기
@xftg77g
2022. 9. 1. 15:47
흔한 경우는 아니겠지만 가끔 필요할 때가 있다.
예를 들어 카테고리는 다른 카테고리를 가리키면서 계층을 형성한다. 그런데 계층마다 이름만 다른 똑같이 생긴 카테고리 클래스를 생성해서 관계를 맺는 것은 비효율적이다. 이런 경우 같은 카테고리 클래스끼리 다대일 양방향 관계를 맺는 것이 편리하다.
아래는 카테고리 클래스로 다대일 양방향 관계를 맺은 모습이다.
@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()
);
}
생성된 테이블의 모습

댓글과 대댓글 관계에도 이용할 수 있을 것이라고 생각된다.