728x90
반응형
게시물을 올릴 때 첨부파일도 가능하게 하면서 테이블의 관계를 다시 설정해야했다. 나는 미리 게시글과 댓글과의 관계가 @ManyToOne으로 되어 있기 때문에 간단하게 객체처리가 가능하도록 @OneToMany로 구성하기오 하였다
@OneToMany 적용하기
게시물과 댓글에서는 댓글을 중심으로 해석해서 @ManyToOne을 사용하였다.
게시물과 첨부파일도 역시 어떤 것을 중심으로 둘 것인가에 따라서 관계가 달라지지만 게시물에 중심을 두어 @OneToMany를 사용한다.
@OneToMany는 상위 엔티티(게시물)와 여러 개의 하위 엔티티들(첨부파일)의 구조이다. → PK를 가진 쪽에서 사용 (@ManyToOne는 다른 엔티티 객체의 참조로 FK를 가지는 쪽에서 하는 방식)
@OneToMany 특징
- 상위 엔티티에서 하위 엔티티들을 관리
- JPA의 Repository를 상위 엔티티 기준으로 생성
- 상위 엔티티 상태가 변경되면 하위 엔티티 상태도 변경
- 상위 엔티티 하나와 하위 엔티티 여러 개를 처리하는 경우 N+1 문제가 발생할 수 있음
내가 적용한
첨부파일 엔티티 클래스
package com.example.board.domain;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import lombok.*;
@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = "board")
public class BoardImage implements Comparable<BoardImage>{
@Id
private String uuid;
private String fileName;
private int ord;
@ManyToOne
private Board board;
@Override
public int compareTo(BoardImage o) {
return this.ord - o.ord;
}
}
- @ManyToOne으로 Board 객체 지정
- 연관관계 적용 : @ToString(exclude = "board")
- Comparable 인터페이스 : @OneToMany에서 순번에 맞게 정렬하기 위해 사용
양방향(bidirectiona) 참조
@ToString(exclude = "imageSet")
public class Board extends BaseEntity{
. . .
@OneToMany
@Builder.Default
private Set<BoardImage> imageSet = new HashSet<>();
}
- 연관관계 적용 : @ToString(exclude = "imageSet")
mappedBy
@OneToMany는 각 엔티티에 해당하는 테이블을 독립적으로 생성하고 중간에 매핑해 주는 테이블이 생성된다.
board_image_set 테이븡리 @OneToMany를 처리하기 위해서 생성된 것이고 이걸 매핑 테이블이라고 한다.
매핑 테이블을 생성하지 않기
1. 단방향 @OneToMany, @JoinColumn 이용
2. mappedBy 이용
여기서 mappedBy를 이용해본다. mappedBy는 어떤 엔티티의 속성으로 매핑되는지를 의미한다.
수정
@OneToMany(mappedBy = "board")
@Builder.Default
private Set<BoardImage> imageSet = new HashSet<>();
728x90
반응형
'Tech > JPA' 카테고리의 다른 글
[JPA] 준영속 엔티티 수정 (변경 감지/병합(merge)) (0) | 2024.06.18 |
---|---|
[JPA] 'N+1 문제'와 @BatchSize (0) | 2024.04.17 |
[JPA] @EntityGraph 사용 (0) | 2024.04.16 |
[JPA] 영속성의 전이 (cascade) (0) | 2024.04.15 |
[JPA] 다대일(ManyToOne) 연관관계에 대해 간단히 알아보자. (0) | 2024.04.10 |
댓글