본문 바로가기
Tech/JPA

[JPA] @OneToMany 연관 관계를 적용

by 싱브이 2024. 4. 14.
728x90
반응형

게시물을 올릴 때 첨부파일도 가능하게 하면서 테이블의 관계를 다시 설정해야했다.  나는 미리 게시글과 댓글과의 관계가 @ManyToOne으로 되어 있기 때문에 간단하게 객체처리가 가능하도록 @OneToMany로 구성하기오 하였다

 

 


@OneToMany 적용하기

게시물과 댓글에서는 댓글을 중심으로 해석해서 @ManyToOne을 사용하였다. 

게시물과 첨부파일도 역시 어떤 것을 중심으로 둘 것인가에 따라서 관계가 달라지지만 게시물에 중심을 두어 @OneToMany를 사용한다.

@OneToMany는 상위 엔티티(게시물)와 여러 개의 하위 엔티티들(첨부파일)의 구조이다. → PK를 가진 쪽에서 사용 (@ManyToOne는 다른 엔티티 객체의 참조로 FK를 가지는 쪽에서 하는 방식)

 

 


@OneToMany 특징

 


내가 적용한

 

첨부파일 엔티티 클래스

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<>();

 

수정 후

 

 

 

 

 

 

 

 

참고 : https://product.kyobobook.co.kr/detail/S000061549872

728x90
반응형

댓글