독학/[etc] 에러 해결 기록

[Spring JPA🌿] fetch join + 지연로딩 관련 에러 해결

최연재 2024. 7. 6. 18:39

해결 과정에서 같이 만났던 오류/에러들

- Large Objects may not be used in auto-commit mode
- MultipleBagFetchException
- failed to lazily initialize a collection of role
 

상황 설명 및 해결

1) Large Objects may not be used in auto-commit mode

게시글의 본문에 대해서 @Lob 어노테이션을 붙여서 코드를 짰다. 이후 코드를 실행했을 때 DB에서 oid 타입으로 값이 저장된 것을 확인할 수 있었다.

데이터 타입을 text로 변경하기 위해서 어노테이션을 다음과 같이 수정했다.

@Column(nullable = false, columnDefinition = "text")
private String content;

사실 이 문제는 제목과는 크게 관련이 없을 수도 있는데, 문제를 해결하는 과정에서 같이 만났던 문제였기 때문에 같이 기록한다.
 

2) MultipleBagFetchException

엔티티와 연관된 모든 정보를 가져와야 하는 부분을 짜다가 LazyInitializationException 에러가 났다. JPA N+1문제도 같이 해결하기 위해서 Fetch Join을 사용하는 것으로 코드를 변경했다.

@Query("SELECT DISTINCT p FROM Post p " +
        "LEFT JOIN FETCH p.images " +
        "LEFT JOIN FETCH p.postHashtags " +
        "ORDER BY p.createDate DESC")
List<Post> findAllPost();

위와 같이 코드를 짰는데 MultipleBagFetchException이 발생했다. 
 
찾아보니 Fetch Join은 ToMany 1개만 가능하다고 한다. 해결하기 위해 쿼리를 나눠서 하거나 배치 사이즈를 설정하는 방법이 있다. 나는 이미 배치 사이즈를 설정해둔 상태였기 때문에 아래처럼 쿼리를 쪼개서 해결했다.

@Query("SELECT p FROM Post p JOIN FETCH p.images WHERE p.id = :postId")
Post findPostWithImagesById(@Param("postId") Long postId);

@Query("SELECT p FROM Post p JOIN FETCH p.postHashtags WHERE p.id = :postId")
Post findPostWithPostHashtagsById(@Param("postId") Long postId);

@Query("SELECT p FROM Post p")
List<Post> findAllPostWithImagesAndPostHashtags();

 

3) failed to lazily initialize a collection of role

JPA에서 지연로딩을 하기 위해서는 항상 영속성 컨텍스트가 있어야 하는데, 트랙잭션 밖에서 조회를 시도해서 발생한 문제라고 한다. 그래서 관련된 모든 메소드에 @Transactional 어노테이션을 추가해서 해결했다.

200 ok를 드디어 만났다

 
 
 

도움 받은 링크들

https://winter1396love.tistory.com/68

JPA + Postgres 사용시 주의할 @Lob

프로젝트로 Entity 작성시 평소와 같이 @Lob를 사용하고 있었다. Postman을 통해서 등록 메소드를 테스트 하는 상황에서 문제가 발생했다. title, contents의 값이 의도와 다르게 contents에 이상한 숫자가

winter1396love.tistory.com

 
https://velog.io/@myway00/DEBUG-org.postgresql.util.PSQLException-Large-Objects-may-not-be-used-in-auto-commit-mode

[DEBUG] org.postgresql.util.PSQLException: Large Objects may not be used in auto-commit mode.

large object (LOB) 데이터 get API 메소드 작성 시 유의점

velog.io

https://www.inflearn.com/questions/33949/failed-to-lazily-initialize-a-collection-of-role-%EC%98%A4%EB%A5%98-%EA%B4%80%EB%A0%A8-%EB%AC%B8%EC%9D%98

failed to lazily initialize a collection of role 오류 관련  문의 - 인프런

안녕하세요. 항상 친절하고 정확한 답변 감사합니다. 지금 작업하다가 발생한 오류로 헤매고 있어서 질문드립니다. 소셜로그인으로 로그인 시 기존 회원정보가 없으면 생성하고 나서 소셜로그

www.inflearn.com

https://jojoldu.tistory.com/457

MultipleBagFetchException 발생시 해결 방법

JPA의 N+1 문제에 대한 해결책으로 Fetch Join을 사용하다보면 자주 만나는 문제가 있습니다. 바로 MultipleBagFetchException 입니다. 이 문제는 2개 이상의 OneToMany 자식 테이블에 Fetch Join을 선언했을때 발

jojoldu.tistory.com

https://pasudo123.tistory.com/473

20210829 [error] org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

개요 jpa 이용할 시에 @OneToMany 를 여러개 페치조인으로 들고올 때, 발생되는 멀티백페치 익셉션 에러 탐구 원인 hibernate 에서는 @OneToMany 로 컬렉션에 대한 페치조인을 들고올 때, hibernate 는 java/kotl

pasudo123.tistory.com