반응형

 


 

JPA 테스트 중에 분명 fetch LAZY로 설정했는데, 

 

sql을 보니 LAZY Entity까지 조인을 하면서 마치 EAGER처럼 동작을 하는 문제가 있었다.

 

 


 

 

@OneToMany(mappedBy = "user1", fetch = FetchType.LAZY)
private List<UserParty> userParty;

 

@Test
void test9(){
    itemRepository.findByItemNameLikeAndUser1_NameLike("%2", "c%").forEach(System.out::println);
    System.out.println("-----");
    // lazy 인데 왜 userParty 쿼리가 나갈까

}

 

itemRepository에서 user1을 사용하는 쿼리 메서드

 

User1 ---> UserParty는 분명 LAZY인데 마치 EAGER처럼 UserParty를 전부 가져왔다.

 

 

문제 상황은 [ Item ---> User1 ---> UserParty ] 까지 전이되어 전부가져옴

 

원하는 것은 [ Item ---> User1 ] 까지

 


 

해결은 단순했다.

 

@OneToMany(mappedBy = "user1", fetch = FetchType.LAZY)
@ToString.Exclude
private List<UserParty> userParty;

 

Entity 상단에 설정된 @ToString 때문에 getter가 동작하여 EAGER처럼 계속 조회해서 사용하는 것이었다.

 

@ToString.Exclude를 붙여서 getter를 호출하지 않게 설정하고 LAZY로 정상 작동되게 했다.

 

fetch LAZY 를 설정하면 ToString.Exclude 를 같이 사용

반응형

+ Recent posts