org.hibernate.LazyInitializationException

방세현·2024년 2월 21일
0

프로젝트

목록 보기
2/4

오류 설명

  • 이 오류는 지연 로딩된 엔티티나 컬렉션에 접근하려 할때 세션이 이미 종료되어있으면 발생하는 오류다. 지연로딩이란 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하고 프록시 객체를 내보내는 방식이다.
    @ElementCollection
    @Column(name = "day")
    private List<String> day;

나의 경우에는 위의 List에 저장된 day를 조회할때 다음과 같은 오류가 발생하였다.

문제 해결

이 오류의 원인은 지연오류라는 것을 염두에 두고 해결 과정을 찾아 여러가지를 시도하던 중 @EntityGraph를 이용해 즉시로딩을 하는 방법을 찾았다.

public interface UserCareServiceRepository extends JpaRepository<UserCareService, Integer> {

    @EntityGraph(attributePaths = {"day"})
    @Override
    Optional<UserCareService> findById(Integer id);
}

다음과 같이 findById메서드를 오버라이딩 한 후 @EntityGraph어노테이션을 붙여 findById로 조회하면 프록시가 아닌 실제 엔티티객체를 조회하여 오류를 해결할 수 있다. 단 즉시로딩을 하면 연관된 쿼리를 조회할때 모든 연관 쿼리를 불러오는 N+1문제를 야기할 수 있으므로 상황에 맞게 사용해야 한다.

0개의 댓글