반응형
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 를 같이 사용
반응형
'프로그래밍 > JPA' 카테고리의 다른 글
[JPA] LazyInitializationException 해결 (0) | 2023.09.29 |
---|---|
[JPA] 영속성 컨텍스트 (0) | 2022.08.18 |
[JPA] 관계 설정 연관 관계의 주인, Cascade, N+1 (0) | 2022.05.09 |