[에러] LazyInitializationException

myeonji·2022년 5월 3일
0

에러

LazyInitializationException: failed to lazily initialize a collection of role: com.dormammu.BooklogWeb.model.User.portfolios, could not initialize proxy - no Session

원인

ManyToOne 양방향의 User에서 Portfolio 조회할 때 영속성 컨텍스트가 종료되어서 발생하는 오류

즉, 지연 로딩으로 생성된 프록시를 초기화 하는 것(연관된 데이터를 가져오는 것)이 불가능하다는 것이다. (트랜잭션이 이미 종료된 이후에 연관된 데이터에 접근하려고 시도했지만 실패)

List<Portfolio> portfolios = user.getPortfolios(); 에서 에러가 나는 것 같다.

해결

  1. @OneToMany(mappedBy = "team", fetch = FetchType.EAGER)을 추가하거나
    private List members = new ArrayList<>();

  2. @Transactional를 테스트 코드에 추가한다

알게된 것

  • 즉시 로딩(EAGER)은 데이터를 가져올 때 조인을 사용해서 연관된 데이터를 한번에 가져오는 방식, 즉시로딩으로 조회된 엔티티의 연관관계 필드에는 실제 엔티티 객체가 반환

  • 지연 로딩(LAZY)은 데이터를 가져올 때 프록시라는 가짜 엔티티를 사용해 필요한 데이터만 가져오고, 연관된 데이터를 사용하려는 시점에 다시 데이터를 가져오는 방식, 연관관계를 참조하기 전까지는 프록시 객체가 초기화되지 않고 프록시 객체를 참조할 때 프록시 객체가 초기화 되고 SQL이 질의됨

프록시 : https://logical-code.tistory.com/139?category=783892
즉시로딩/지연로딩 : https://logical-code.tistory.com/140?category=783892

0개의 댓글