인프런 커뮤니티 질문&답변

안용상님의 프로필 이미지
안용상

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

조인

저는 team query가 나가지 않습니다만...

작성

·

213

0

public class JpaMain {

public static void main(String[] args) {

EntityManagerFactory emf = Persistence.
createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();

try {
tx.begin()
;

Team team = new Team();
team.setName("teamA");
em.persist(team);

Member member = new Member();
member.setUsername("member1");
member.setAge(10);
member.changeTeam(team);
em.persist(member);


List<Member> result = em.createQuery("select m from Member m inner join m.team t", Member.class)
.getResultList()
;

tx.commit();
} catch (Exception ex) {
ex.printStackTrace()
;
tx.rollback();
} finally {
em.close()
;
emf.close();
}

}
}

저는 Member entity에 team을 LAZY 로 세팅하지 않아도
Hibernate: /* select m from Member m inner join m.team t */ select member0_.id as id1_0_, member0_.age as age2_0_, member0_.TEAM_ID as TEAM_ID4_0_, member0_.username as username3_0_ from Member member0_ inner join Team team1_ on member0_.TEAM_ID=team1_.id

이 쿼리만 나갑니다.
강사님는 team query가 나가는 것으로 영상에 찍었는데 저와 좀 다르네요.

답변 1

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 용상님^^

JPQL 쿼리가 조인이 되어 있기는 하지만 결론적으로 fetch join이 아니므로, member만 조회합니다.

JPA가 member를 조회하고 보니, member->team이 즉시로딩으로 설정되어 있습니다. team을 찾기 위해 team query가 나가는 것이 맞습니다. 그런데 보내주신 코드를 보면 처음에 teamA을 영속성 컨텍스트에 저장했습니다.

즉시로딩도 지연로딩과 같이 먼저 영속성 컨텍스트에서 찾고 없으면 데이터베이스에 쿼리를 날립니다!

이 예제에서 teamA는 영속성 컨텍스트에 이미 보관되어 있기 때문에 데이터베이스를 조회할 필요가 없었던 것이지요.

 

JPQL을 실행하기 직전에 다음 코드를 넣어보시면 영속성 컨텍스트에 teamA가 없으므로 team query가 나가는 것을 확인할 수 있습니다.

em.flush();
em.clear();

감사합니다^^

추가적으로 [질문자님 코드에서]Member 엔티티를 구해오는 쿼리가 나간 이유는 영속성 컨텍스에 엔티티가 있어도

JPQL에선 무조건 select 문이 나가서

Member 엔티티를 구해오는 쿼리가 나간거였습니다. 

맞나요 ??

안용상님의 프로필 이미지
안용상

작성한 질문수

질문하기