MultipleBagFetchException 오류 발생

배상규·2023년 7월 25일
0
post-thumbnail

QueryDsl을 이용하여 Paging하던중 oneToMany 관계에 있던 엔티티를 fetch join하고 그엔티티의 oneToMany 관계의 엔티티를 fetch join을 가져 오려고 했다.
Product.Java

@Entity
@Getter @Setter @EqualsAndHashCode(of="id")
@AllArgsConstructor @NoArgsConstructor
public class Product {

	 @Id @GeneratedValue
    private Long id;
    
        @OneToMany(mappedBy = "product", cascade = CascadeType.ALL)
    private List<ColorProduct> colorProductList = new ArrayList<>();
    ///....
   
}

ColorProduct.Java

@Entity
@Getter @Setter @EqualsAndHashCode(of="id")
@AllArgsConstructor @NoArgsConstructor @Builder
public class ColorProduct {
	
     @Id @GeneratedValue
    private Long id;
    
        @OneToMany(mappedBy = "colorProduct", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<SizeQuantity> sizeList;

    ///....
}

이렇게 만들어진 구조에서 one to many관계를 fetch join으로 가져오려고 하니 MultipleBagFetchException이 발생했다.

원인

JPA에서 Fetch Join의 조건은 다음과 같다.

  • ToOne의 경우 몇개든 사용가능 하다.
  • toMany는 1개만 사용가능하다.

해결법

Set을 사용한다.
set을 사용하면 PersistentBag이 아니라

PersistentSet으로 로드 되기에 조건에 걸리지 않는다.
하지만 이때 Set 자료구조상 순서를 보장하지 않는다.

default batch fetcch size 조정
default batch fetcch size 조정을 통해 N+1 문제를 해결 할 수 있습니다.

나의 경우
나의 경우 페이징 작업과 하위에 있는 엔티티들의 자료의 순서가 중요하지 않다고 판단하여 Set을 사용하여 수정했습니다.

profile
기록에 성장을

0개의 댓글