지연로딩을 기본 페치전략으로 가져가는 경우 어떤 문제점이 있을까??
예시로 바로 살펴보자.
@Entity
class User{
...
@ManyToOne(fetch = FetchType.LAZY )
private Team team;
...
}
@Entity
class Team{
@OneToMany(mappedBy = "team") // 기본적으로 LAZY
private List<User> users = new ArrayList<>();
...
}
영속성 컨텍스트는 깨끗하게 비워져있는 상태라고 가정한다. 아래의 데이터베이스 상황에서 쿼리를 날린다면??
List<User> users = em.createQuery("select u from User u",User.class).getResultList();
for (User u : users) {
System.out.println("###"+u.getName()+" : "+u.getTeam().getName());
}
문제점) 프록시객체의 상태필드값을 묻는 코드에서 매번 쿼리를 날림.
해결) 페치조인으로 연관된 객체를 다 땡겨오자.
List<User> users = em.createQuery("select u from User u join fetch u.team",User.class).getResultList();
결과)
만약에 그냥 join 하면 기존의 문제점들처럼 똑같은 문제가 발생됨.
'JPA' 카테고리의 다른 글
[JPA] 벌크연산 주의점 (0) | 2020.08.06 |
---|---|
[JPA] 일대다 조인할때 영속성 컨텍스트 내부 모습 & distinct (0) | 2020.08.06 |
[JPA / JPQL] @ManyToOne, @OneToOne 과 묵시적 조인 (0) | 2020.08.06 |
[JPA] @Embeddable , @Embedded (0) | 2020.08.06 |
[JPA] CASCASDE 옵션 & orphanRemoval (0) | 2020.08.06 |
댓글