MultipleBagFetchException 에러

jaegeunsong97·2023년 8월 21일
0

SSR 기반 JoshuaBlog

목록 보기
23/23

package coffee.pastry.joshuablog.model.board;

import java.time.LocalDateTime;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import coffee.pastry.joshuablog.model.love.Love;
import coffee.pastry.joshuablog.model.reply.Reply;
import coffee.pastry.joshuablog.model.user.User;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Table(name = "board_tb")
@Entity
public class Board {

     /**
      * 1명의 User N개의 게시글 + 1개의 게시글 1명의 User => User:Board=1:N
      */

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
     private String title;
     @Lob // 4GB
     private String content;
     @Lob // 4GB
     private String thumbnail;
     @ManyToOne
     private User user;
     @OneToMany(mappedBy = "board", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
     @JsonIgnoreProperties({ "board" }) // 무한참조 방지...드디어...
     @OrderBy("id desc")
     private List<Reply> replys;
     @JsonIgnoreProperties({ "board" }) // 무한참조 방지
     @OneToMany(mappedBy = "board", fetch = FetchType.EAGER)
     private List<Love> loves;

     private LocalDateTime createdAt;
     private LocalDateTime updatedAt;

     @PrePersist
     protected void onCreate() {
          this.createdAt = LocalDateTime.now();
     }

     @PreUpdate
     protected void onUpdate() {
          this.updatedAt = LocalDateTime.now();
     }

     public void chaengeTitle(String title) {
          this.title = title;
     }

     public void changeContent(String content) {
          this.content = content;
     }
}

같은 엔티티에 fetch 타입이 EAGER가 2개이상 존재하면 생기는 에러 -> 같은 쿼리에 여러 개의 컬렉션을 EAGER 로딩하는 것을 허용 X

해결방법 2가지

1. LAZY + fetch join(JPQL join fetch)

2가지 중에 1개를 LAZY로 바꾸는 것 + join fetch(JPQL fetch join) 사용하기

난 이거 선택

@JsonIgnoreProperties({ "board" }) // 무한참조 방지
@OneToMany(mappedBy = "board")
private List<Love> loves;

2. @Transactional(서비스)

서비스 계층에서 필요한 시점에 컬렉션을 로딩하도록

효과

성능 이슈를 피하고 불필요한 쿼리 감소

profile
현재 블로그 : https://jasonsong97.tistory.com/

0개의 댓글