inblog logo
|
heo-gom
    팀 프로젝트

    [필름톡] 하이버네이트 @OneToMany 에러 - 1

    허성재's avatar
    허성재
    Nov 12, 2024
    [필름톡] 하이버네이트 @OneToMany 에러 - 1
     
    Join할 때 테이블에 OneToMany가 2개 이상일 경우
     
    MultipleBagFetchException 가 발생한다.
     
     
    notion image
     
    notion image
     
     
    데이터의 중복 문제 때문에 MultipleBagFetchException 발생하는 것으로 보인다.
     
     
    notion image
     
    OneToMany 양방향 매핑을 걸어준 필드의 타입은 List 인데
    List → Set 으로 변경하니 위처럼 에러없이 잘 나온다.
     
    하지만 List를 Set으로 변경해서 사용하는 것 보다 좋은 해결책이 있을 것이라는 생각이 들었다.
     
    Set으로 가져오면 일단 정렬이 안된다는 단점도 있다.
     
    MultipleBagFetchException 발생시 해결 방법
    JPA의 N+1 문제에 대한 해결책으로 Fetch Join을 사용하다보면 자주 만나는 문제가 있습니다. 바로 MultipleBagFetchException 입니다. 이 문제는 2개 이상의 OneToMany 자식 테이블에 Fetch Join을 선언했을때 발생합니다. OneToOne, ManyToOne과 같이 단일 관계의 자식 테이블에는 Fetch Join을 써도 됩니다 이 문제에 대한 해결책으로 보통 2가지를 언급하는데요. 자식 테이블 하나에만 Fetch Join을 걸고 나머진 Lazy Loading로 모든 자식 테이블을 다 Lazy Loading으로 이럴 경우 성능상 이슈가 아무래도 해결되는게 아니다 보니, 좀 더 좋은 방법을 소개드리겠습니다. 모든 코드는 Github에 있습니다. 1. 문제 상황 One..
    MultipleBagFetchException 발생시 해결 방법
    https://jojoldu.tistory.com/457
    MultipleBagFetchException 발생시 해결 방법
     
    위 블로그의 내용을 보면
     
    2개 이상의 OneToMany 자식 테이블에 Fetch Join을 선언했을 때 발생하는 MultipleBagFetchException을 해결하기 위해서
     
    1. Fetch Join을 1번만 하고 나머지는 다 Lazy Loading으로 !
    1. 모든 자식 테이블을 다 Lazy Loading으로 !
     
    가져오는 이 2가지 방법을 많이 쓴다고 한다.
     
     
    결론 : OneToMany 가 2개 이상 걸려있으면 여러번 Join 해서 가져오지 X
     
    레이지 로딩으로 가져와야 하는데
     
    1. Join + 레이지로딩
    1. join + inQuery 로 조회(select)
     
    하는 방법 2개를 사용해 보았다
     
     
     
    (To be continued…)
     
     
     
     
    Share article

    heo-gom

    RSS·Powered by Inblog